我正在创建一个contentProvider,我希望能够使用单个批处理操作将多个数据库记录(contentValues)发送到单个表中。
我该怎么做?
batchInsert仅用于插入,但这不意味着插入已存在的东西不会做任何事情吗?
另外,更新操作是否有办法使用特殊约束?例如,我需要忽略主键并根据另外两个一起唯一的字段进行更新。
答案 0 :(得分:0)
“batchInsert仅用于插入”:这是真的但您可以在ContentProvider中覆盖它以执行UPSERT(插入/更新),具体取决于传递给batchInsert的URI。
以下是我目前用于对时间序列数据执行批量插入的一些工作代码(诚然,我只是删除任何妨碍而不是更新的内容,但您可以轻松地将其更改为您自己的目的。)
还要注意使用sql事务;这极大地加快了这个过程。
@Override
public int bulkInsert(Uri uri, ContentValues[] values) {
SQLiteDatabase sqlDB = database.getWritableDatabase();
switch (match(uri)) {
case ONEPROGRAMME:
String cid = uri.getLastPathSegment();
int insertCount = 0;
int len = values.length;
if (len > 0) {
long start = values[0].getAsLong(Programme.COLUMN_START);
long end = values[len - 1].getAsLong(Programme.COLUMN_END);
String where = Programme.COLUMN_CHANNEL + "=? AND " + Programme.COLUMN_START + ">=? AND "
+ Programme.COLUMN_END + "<=?";
String[] args = { cid, Long.toString(start), Long.toString(end) };
//TODO use a compiled statement ?
//SQLiteStatement stmt = sqlDB.compileStatement(INSERT)
sqlDB.beginTransaction();
try {
sqlDB.delete(tableName(PROGRAMME_TABLE), where, args);
for (ContentValues row : values) {
if (sqlDB.insert(tableName(PROGRAMME_TABLE), null, row) != -1L) {
insertCount++;
}
}
sqlDB.setTransactionSuccessful();
} finally {
sqlDB.endTransaction();
}
}
if (insertCount > 0)
getContext().getContentResolver().notifyChange(Resolver.PROGRAMME.uri, null);
return insertCount;
default:
throw new UnsupportedOperationException("Unsupported URI: " + uri);
}
}