是否可以从 ContentProvider bulkInsert 获取最后的 "N" ID?
Is it possible to get the last "N" IDs from a ContentProvider bulkInsert?
问题
假设我想使用 ContentProvider
在 table 上插入 1000 个元素。我通常会为此使用 bulkInsert
。
但是如果我想要成功插入操作的 ID 怎么办?我无法通过 bulkInsert
方法获取该信息,因为它只有 returns 一个 long
。
所以我想知道,有没有办法进行批量插入并获取新插入的 ID?
我现在在做什么
我想到的解决方案是获取最后 "N" 插入的行并获取 bulkInsert
之后的 ID,或者根据插入的列进行查询行(比方说,列 'name')。
两种方法都可以,但我真的需要采取这一额外步骤吗?感觉有点多余...
我的例子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);
}
}
bulkInsert
的约定是 return 受影响的行数,因此我不建议更改它。如果需要任意调用,可以使用ContentResolver.call()
,其中return是一个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");
问题
假设我想使用 ContentProvider
在 table 上插入 1000 个元素。我通常会为此使用 bulkInsert
。
但是如果我想要成功插入操作的 ID 怎么办?我无法通过 bulkInsert
方法获取该信息,因为它只有 returns 一个 long
。
所以我想知道,有没有办法进行批量插入并获取新插入的 ID?
我现在在做什么
我想到的解决方案是获取最后 "N" 插入的行并获取 bulkInsert
之后的 ID,或者根据插入的列进行查询行(比方说,列 'name')。
两种方法都可以,但我真的需要采取这一额外步骤吗?感觉有点多余...
我的例子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);
}
}
bulkInsert
的约定是 return 受影响的行数,因此我不建议更改它。如果需要任意调用,可以使用ContentResolver.call()
,其中return是一个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");