是否可以从ContentProvider bulkInsert中获取最后的“N”ID?

时间:2016-06-13 21:14:18

标签: android sqlite android-contentprovider database-performance

问题

假设我想使用ContentProvider在表格中插入1000个元素。我通常会使用bulkInsert

但是如果我想要成功插入操作的ID怎么办?我无法通过bulkInsert方法获取该信息,因为它只返回long

所以我想知道,有没有办法进行批量插入并获取新插入的ID?

我现在在做什么

出现在我脑海中的解决方案是获取最后一个“N”插入行并获取bulkInsert之后的ID,或者根据插入行的列进行查询(让我们说,列'名称')。

无论哪种方式都有效,但我真的需要采取这一额外措施吗?感觉有点多余......

bulkInsert的示例:

final SQLiteDatabase db = mOpenHelper.getWritableDatabase();

    switch (sUriMatcher.match(uri)) {
        case BLAH: {
            db.beginTransaction();
            int rCount = 0;
            for (ContentValues value : values) {
                long _id = db.insert(SaiteContract.BlahEntry.TABLE_NAME, null, value);
                if (_id != -1) {
                    rCount++;
                }
            }
            db.setTransactionSuccessful();
            db.endTransaction();

            Context context = getContext();
            if (context != null) {
                context.getContentResolver().notifyChange(uri,null);
            }

            return rCount;
        }
        // Other tables
        default:
            return super.bulkInsert(uri,values);
    }
}

1 个答案:

答案 0 :(得分:2)

bulkInsert的合同是返回受影响的行数,因此我不建议更改它。如果您需要进行任意调用,可以使用ContentResolver.call(),它返回一个Bundle。例如,在您的提供程序实现中:

@Override
public Bundle call(String method, String args, Bundle extras) {
    if (method.equals("customInsert")) {
        ContentValues[] values = extras.getParcelableArray("contentValues")
        // do bulk insert and return list of ids in a new Bundle
    }
}

然后只需致电

Bundle result = getContentResolver().call(...);
List<Long> ids = result.getLongArray("ids");