【问题标题】:Update Case in Content Provider更新内容提供者中的案例
【发布时间】:2013-10-05 02:53:43
【问题描述】:

我正在将我的所有 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,每个不同的值/行一个,但我很想知道是否有办法避免这种情况。

有什么想法吗?

【问题讨论】:

  • 进一步澄清您到底想要做什么会很方便。在我看来,您可以只使用另一个 in 语句作为组 ID。
  • 我添加了更多说明。顺便说一句,你的意思是 ContentProvider 中用于传递 List 的方法?我虽然是这样,但是提供者的用户应该如何知道他必须使用该方法...
  • 经过您的澄清,我将采用@tyczj 在下面的回答中提到的内容。将ContentProvider#applyBatchContentProviderOperation 结合使用是为此案例设计的。

标签: android android-sqlite android-contentprovider


【解决方案1】:

要使用 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());

将所有操作放入数组列表后,然后应用批处理

getContentResolver().applyBatch(authority, operations);

当然,您还必须在内容提供程序中覆盖 applyBatch 才能执行所有操作

【讨论】:

  • 尽管不是我想要的“1-query”解决方案,因为所有更新都是在同一个事务中完成的,我最终使用了 ContentProviderOperation 选项。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多