我有一个相当莫名其妙的情况。我在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模式),但我不希望它们重叠。我只是希望能够在服务中填充数据库并在原始活动中对其进行操作。我做错了什么?
答案 0 :(得分:0)
deleteDatabase()
必须在某种程度上是异步的(其源代码并未显示但仍然存在)。因此,在写入和读取操作之前,数据库已被清除。花了很长时间来追踪它...