0

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 つずつ実行できることはわかっていますが、これを回避する方法があるかどうかは知りたいです。

何か案は?

4

1 に答える 1