【问题标题】:ContentProvider empty after bulk insert批量插入后 ContentProvider 为空
【发布时间】:2016-01-14 04:01:24
【问题描述】:

这不是我第一次构建 ContentProviders。但这是我第一次遇到这个问题,我不知道如何解决它。

我做了一个批量插入,它返回计数为 4。然后我立即对所有内容进行查询,查询返回计数 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);
    }

【问题讨论】:

    标签: android android-contentprovider bulkinsert android-contentresolver


    【解决方案1】:

    您需要在结束事务之前调用setTransactionSuccessful,否则endTransaction 调用将执行回滚(或不提交)。

    db.beginTransaction();
    ...
    try {
        ...
        db.setTransactionSuccessful();
    } finally {
        db.endTransaction();
    }
    

    【讨论】:

    • 谢谢。我以前从来没有这样做过。它去哪儿了?在“db.endTransaction”之后。过去它是如何运作的?
    • 它有效。但我以前从来没有这样做过。这是新规则吗?
    • @NouvelTravay 这不是新的,也许在过去你没有做 beginTransaction?
    • 没有。我过去总是这样做。事实上,我复制并粘贴了一个正在生产中的现有代码。所以也许它与设备有关。
    猜你喜欢
    • 2019-04-23
    • 2019-10-07
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    相关资源
    最近更新 更多