我正在将所有 SQLite 查询迁移到内容提供程序以使用 SyncAdapter,但我面临更新案例的问题,我不知道如何传递给解析器。查询是这样的:
public void updateGroupSortAllPositions(List<Group> list)
{
mngr.dbOpenRW();
String query = "UPDATE " + DB_GROUP_TABLE_NAME + " SET " + DB_GROUP_COLUMN_SORT_POSITION + " = CASE " + DB_GROUP_COLUMN_ID + " ";
for (Group g : list)
{
query += " WHEN " + g.getId() + " THEN " + g.getOrder() + " ";
}
query += " END WHERE " + DB_GROUP_COLUMN_ID + " IN ( ";
for (int i=0 ; i<list.size() ; i++)
{
if (i != list.size()-1)
query += list.get(i).getId() + ", ";
else
query += list.get(i).getId();
}
query += " )";
mngr.rawSQL(query);
mngr.dbClose();
}
(它是我制作的 SQLiteDataBase 的包装器,但这不是这里的交易。)
问题是我不知道如何将该列表传递给解析器,我唯一能想到的是进行“N”更新(解析器调用),每行一个,但我会失去性能更新案例查询,这是处理大型数据集的巨大差异。
澄清编辑
由于 ContentResolver 的更新是这样的:
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
{
}
我只能在 ContentValues 中指定 1 个值(每列)来修改 Selection 中的 1..N 行,而在我拥有的更新案例中,我可以在 1 个查询/更新中指定每一行的值。我知道我可以执行 N 个 ContentResolver.update,每个不同的值/行一个,但我很想知道是否有办法避免这种情况。
有任何想法吗?