sqlite在写完后回读

时间:2014-11-30 13:41:21

标签: android sqlite android-sqlite

我有一个相当莫名其妙的情况。我在IntentService

中写入数据库
App.database.beginTransaction();
try {
  for (Data item : data) {
    ContentValues values = item.getValues();
    if (App.database.insertWithOnConflict(TABLE_NAME, null, values, SQLiteDatabase.CONFLICT_IGNORE) < 1)
      App.database.updateWithOnConflict(TABLE_NAME, values, "id=?", new String[] { item.id }, SQLiteDatabase.CONFLICT_REPLACE);
  }
  App.database.setTransactionSuccessful();
}
catch (Exception e) {
  Log.i(TAG, e.toString());
}
finally {
  App.database.endTransaction();
}

正确应用交易调用。写操作期间没有异常也没有回滚。如果我在写完之后通过回读来检查数据库,我会得到完整的行计数:数据库填充。

Log.i(TAG, "count " + Data.getCount()); // returns correct row count
ResultReceiver receiver = intent.getParcelableExtra("receiver");
receiver.send(RESULT_INITIALIZED, null);

写作完成后,IntentService会使用ResultReceiver通知我的活动,以便进行书写操作。

private class MyResultReceiver extends ResultReceiver {

@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
  Log.i(TAG, "count " + Data.getCount()); // returns zero
}

但是,如果我在接收器中再次检查我的数据库行数,则得到零,数据库为空。 Data.getCount()只需打开一个新光标并获取计数:

public static int getCount() throws SQLiteException {
  Cursor cursor = App.database.query(TABLE_NAME, null, null, null, null, null, null);
  int count = cursor.getCount();
  cursor.close();
  return count;
}

我知道同时读取和写入的限制(以及WAL模式),但我不希望它们重叠。我只是希望能够在服务中填充数据库并在原始活动中对其进行操作。我做错了什么?

1 个答案:

答案 0 :(得分:0)

毕竟,这是一个令人讨厌的事。应用启动序列中不同部分的deleteDatabase()必须在某种程度上是异步的(其源代码并未显示但仍然存在)。因此,在写入和读取操作之前,数据库已被清除。花了很长时间来追踪它...