SyncAdapter を使用するためにすべての SQLite クエリをコンテンツ プロバイダーに移行していますが、リゾルバーに渡す方法がわからない更新ケースの問題に直面しています。クエリは次のとおりです。
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();
}
(mngr は私が作成した SQLiteDataBase のラッパーですが、ここでは扱いません。)
問題は、そのリストをリゾルバーに渡す方法がわからないことです。私が考えることができる唯一のことは、行ごとに1つずつ「N」個の更新(リゾルバー呼び出し)を行うことですが、パフォーマンスが低下しますこれは、大規模なデータセットを処理する大きな違いです。
明確化編集
ContentResolver の更新は次のようになっているため:
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
{
}
ContentValues で (列ごとに) 1 つの値のみを指定して、Selection の 1..N 行を変更できますが、更新の場合は、1 つのクエリ/更新で各行の値をすべて指定できます。N 個の ContentResolver.update を、異なる値/行ごとに 1 つずつ実行できることはわかっていますが、これを回避する方法があるかどうかは知りたいです。
何か案は?