内容提供商中的更新案例

时间:2013-10-03 19:24:46

标签: android android-sqlite android-contentprovider

我正在将我的所有SQLite查询迁移到Content Provider以使用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();
}

(mngr是我制作的SQLiteDataBase的包装器,但这不是这里的交易。)

问题是我不知道如何将该List传递给解析器,我唯一能想到的就是进行“N”更新(解析器调用),每行一个,但我会丢失更新案例查询的性能,这是处理大型数据集的巨大差异。

澄清编辑

由于ContentResolver的更新如下:

@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 
{

}

我只能在ContentValues中指定1个值(每列)来修改Selection中的1..N行,而在更新的情况下,我可以在1个查询/更新中指定每行的值。我知道我可以执行N个ContentResolver.update,每个不同的值/行一个,但我愿意知道是否有办法避免这种情况。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

要使用ContentResolver进行更新,只需调用

即可
getContentResolver().update(uri,contentValues,where,selectionArgs);

使用您的where子句说明您要更新的行

将一次更新一行,我知道你不想要。

如果是这样,我会使用ContentProviderOperation进行批量更新

例如:

ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();

向列表添加新操作

operations.add(ContentProviderOperation.newUpdate(uir).withSelection(where,selectArgs).withValues(values).build());

将所有操作放入arraylist后,您应用批次

getContentResolver().applyBatch(authority, operations);

当然,您还必须覆盖内容提供商中的applyBatch以执行所有操作