android 数据库只读,android – SQLiteReadOnlyDatabaseException:尝试编写只读数据库(代码1032)...

所以在一些罕见的情况下,我看到“尝试编写只读数据库”的消息,我无法弄清问题所在.我将从我的logcat中的堆栈跟踪开始…正如您从时间戳中看到的那样,我在尝试写入之前仅检查了db.isReadOnly()1ms. (isOpen = true,readOnly = false)

01-29 13:47:49.115: D/AWT(11055): #479.Got writable database (230537815): isOpen: (true) isReadOnly: (false) inTransaction: (false)

01-29 13:47:49.116: D/AWT(11055): #479.in transaction: Got writable database (230537815): isOpen: (true) isReadOnly: (false) inTransaction: (true)

01-29 13:47:49.116: E/SQLiteLog(11055): (1032) statement aborts at 15: [INSERT INTO Events(col1,col2,col3,col4) VALUES (?,?,?,?)]

01-29 13:47:49.117: E/SQLiteDatabase(11055): Error inserting data="scrubbed"

01-29 13:47:49.117: E/SQLiteDatabase(11055): android.database.sqlite.SQLiteReadOnlyDatabaseException: attempt to write a readonly database (code 1032)

01-29 13:47:49.117: E/SQLiteDatabase(11055): at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)

01-29 13:47:49.117: E/SQLiteDatabase(11055): at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:780)

01-29 13:47:49.117: E/SQLiteDatabase(11055): at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)

01-29 13:47:49.117: E/SQLiteDatabase(11055): at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)

01-29 13:47:49.117: E/SQLiteDatabase(11055): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1471)

01-29 13:47:49.117: E/SQLiteDatabase(11055): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341)

01-29 13:47:49.117: E/SQLiteDatabase(11055): at com.company.DbHelper.insertBatch(EventsDbHelper.java:174)

01-29 13:47:49.117: D/AWT(11055): #479.finalizing transaction: Got writable database (230537815): isOpen: (true) isReadOnly: (false) inTransaction: (true)

01-29 13:47:49.118: W/SQLiteLog(12120): (28) file unlinked while open: /data/user/0/com.company.app/databases/MyDatabase.db

从我的来源:

public void insertBatch(LinkedList writeQueue) throws Exception {

Log.d("AWT", "EventsDbHelper->insertBatch()");

if (writeQueue == null) {

return;

}

Iterator it = writeQueue.iterator();

SQLiteDatabase db = this.getWritableDatabase();

Log.d("AWT", String.format("Got writable database (%s): isOpen: (%s) isReadOnly: (%s) inTransaction: (%s)",

db.hashCode(), db.isOpen(), db.isReadOnly(), db.inTransaction()));

try {

db.beginTransaction();

while (it.hasNext()) {

DatabaseRecord record = it.next();

ContentValues initialValues = new ContentValues();

initialValues.put(col1, val1);

initialValues.put(col2, val2);

initialValues.put(col3, val3);

initialValues.put(col4, val4);

Log.d("AWT", String.format("in transaction: Got writable database (%s): isOpen: (%s) isReadOnly: (%s) inTransaction: (%s)",

db.hashCode(), db.isOpen(), db.isReadOnly(), db.inTransaction()));

db.insert(DBTBL, null, initialValues);

}

Log.d("AWT", String.format("finalizing transaction: Got writable database (%s): isOpen: (%s) isReadOnly: (%s) inTransaction: (%s)",

db.hashCode(), db.isOpen(), db.isReadOnly(), db.inTransaction()));

db.setTransactionSuccessful();

} catch (Exception e) {

Log.e(TAG, "Error inserting batch record into database.", e);

} finally {

try {

db.endTransaction();

db.close();

} catch (Exception e) {

Log.e(TAG, Global.DB_ERROR, e);

}

}

}

所以我认为可能发生了两件事之一.

>在检查和尝试的批量插入之间的1ms内,DB确实被关闭/设置为“只读”.

> isReadOnly对我说谎,而不是准确报告数据库的状态.

>我的插入中途正在删除数据库!请参阅上面日志的最后一行.我打开了针对SQLite的严格日志记录并注意到了上述情况.我怀疑第三方库可能会丢弃我的所有数据库.

虽然在这一点上有想法,但我愿意尝试任何建议.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值