sqlite在android闪退,为什么我的Android SQLite数据库突然崩溃了?

博客内容描述了Android应用中SQLite数据库突然崩溃的问题,出现CREATE TABLE android_metadata失败和文件加密错误。异常堆栈跟踪显示在setLocale()时遇到问题。开发者使用SQLiteOpenHelper管理数据库,怀疑并发访问可能导致问题,但不确定如何诊断原因、恢复数据库以及防止未来发生类似情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

突然间,我的应用程序正在使用的数据库似乎已经损坏了.

我没有改变数据库的结构,但我今天在我的设备上多次重新部署了应用程序.

它抛出以下异常.

E/Database(14281): CREATE TABLE android_metadata failed err=26 ..

E/Database(14281): Failed to setLocale() when constructing, closing the database

E/Database(14281): android.database.sqlite.SQLiteException: file is encrypted or is not a database

E/Database(14281): at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)

E/Database(14281): at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1848)

E/Database(14281): at android.database.sqlite.SQLiteDatabase.(SQLiteDatabase.java:1798)

E/Database(14281): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:798)

E/Database(14281): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:857)

E/Database(14281): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:850)

E/Database(14281): at android.app.ApplicationContext.openOrCreateDatabase(ApplicationContext.java:539)

E/Database(14281): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:193)

E/Database(14281): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)

E/Database(14281): at com.ecs.android.gps.storage.DBAdapter.open(DBAdapter.java:75)

使用SQLLiteOpenHelper类初始化数据库.

public DBAdapter(Context ctx)

{

this.context = ctx;

DBHelper = new DatabaseHelper(context);

}

private static class DatabaseHelper extends SQLiteOpenHelper

{

DatabaseHelper(Context context)

{

super(context, DATABASE_NAME, null, DATABASE_VERSION);

}

@Override

public void onCreate(SQLiteDatabase db)

{

db.execSQL(DATABASE_CREATE);

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion,

int newVersion)

{

Log.w(TAG, "Upgrading database from version " + oldVersion

+ " to "

+ newVersion + ", which will destroy all old data");

db.execSQL("DROP TABLE IF EXISTS location_history");

onCreate(db);

}

}

>我基本上打开/关闭两者

每个数据库和游标

操作.

>一些文章表明

这是要走的路,但对于

Android应用程序,没有更多的意义

保持数据库连接打开

每时每刻 ?

>我可以想象它

需要更多资源

每次打开/关闭它.

>有多个活动和服务

访问数据库. (可能在同一时间)

>我从未在日志中看到异常

知道是什么导致了这种情况,如何从中恢复,以及如何在将来防止这种情况发生?

由于一些并发问题(多个线程试图打开/关闭或读/写数据库),我的印象是异常即将到来.我不知道SQLite数据库在多线程访问,锁定等方面与普通数据库(mysql-oracle)一样健壮到什么程度.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值