批量插入后 ContentProvider 为空
ContentProvider empty after bulk insert
这不是我第一次构建 ContentProvider。但这是我第一次遇到这个问题,我不知道该怎么做才能解决它。
我做了一个批量插入,returns 算作 4。然后我立即查询所有内容,查询 returns 算作 0。我不会删除任何地方。有什么想法可能会导致这种情况吗?
好像输入到 ContentProvider 的数据莫名其妙地丢失了。实际上,这里是 bulkInsert 代码
@Override
public int bulkInsert(Uri uri, ContentValues[] values) {
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
final String tableName = DogContract.DogEntry.TABLE_NAME;
db.beginTransaction();
int count = 0;
try {
for (ContentValues value : values) {
long id = db.insert(tableName, null, value);
if (0 < id) count++;
Timber.d("insertion id: %s",id);
}
} finally {
db.endTransaction();
}
Timber.d("successful bulk insert for count: %s",count);
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
和查询
private Cursor getAllDogs(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Timber.d("Call to get all getAllDogs");
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
return db.query(DogContract.DogEntry.TABLE_NAME, null, null, null, null, null, null);
}
您需要在结束事务之前调用setTransactionSuccessful
,否则endTransaction
调用将执行回滚(或不提交)。
db.beginTransaction();
...
try {
...
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
这不是我第一次构建 ContentProvider。但这是我第一次遇到这个问题,我不知道该怎么做才能解决它。
我做了一个批量插入,returns 算作 4。然后我立即查询所有内容,查询 returns 算作 0。我不会删除任何地方。有什么想法可能会导致这种情况吗?
好像输入到 ContentProvider 的数据莫名其妙地丢失了。实际上,这里是 bulkInsert 代码
@Override
public int bulkInsert(Uri uri, ContentValues[] values) {
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
final String tableName = DogContract.DogEntry.TABLE_NAME;
db.beginTransaction();
int count = 0;
try {
for (ContentValues value : values) {
long id = db.insert(tableName, null, value);
if (0 < id) count++;
Timber.d("insertion id: %s",id);
}
} finally {
db.endTransaction();
}
Timber.d("successful bulk insert for count: %s",count);
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
和查询
private Cursor getAllDogs(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Timber.d("Call to get all getAllDogs");
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
return db.query(DogContract.DogEntry.TABLE_NAME, null, null, null, null, null, null);
}
您需要在结束事务之前调用setTransactionSuccessful
,否则endTransaction
调用将执行回滚(或不提交)。
db.beginTransaction(); ... try { ... db.setTransactionSuccessful(); } finally { db.endTransaction(); }