【问题标题】:Android ContentProvider and ContentProviderOperation.newUpdate()Android ContentProvider 和 ContentProviderOperation.newUpdate()
【发布时间】:2016-11-14 16:44:13
【问题描述】:

我正在尝试在自定义 contentprovider 上使用覆盖的 applyBatch() 方法。我知道它通过了 ContentProviderOperations 的 ArrayList。就我而言,它们都是更新 ContentProviderOperations。在我的提供程序中,我想更新一个简单数组(我现在的备用数据库)中的数据,该数组最初插入到 ContentProviderOperation.Builder 中。

到目前为止的重要代码位:

我在哪里使用通道数组中的数据构建 ContentProviderOperations:

public void setNumValues(Uri mindex, int[] channels)
        {//setting type to 0 first for everything
            //first is RPM, then Speed
            ContentValues[] values = new ContentValues[channels.length];        
            ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();

        for (int i = 0; i< channels.length-1; i++){
            values[i].put(NumberProvider.numColumnNames[NumberProvider.VALUE], channels[i]);
            values[i].put(NumberProvider.numColumnNames[NumberProvider.TYPE], 0);

        operations.add(ContentProviderOperation.newUpdate(NumberProvider.NUM_PROVIDER_MODEL_URI).withValues(values[i]).build());
        }
        //values.put(NumberProvider.numColumnNames[NumberProvider.VALUE], value);   
        //mContext.getContentResolver().update(mindex, values, null,null);
        try {
            mContext.getContentResolver().applyBatch(NumberProvider.NUM_AUTHORITY,operations);
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (OperationApplicationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

然后是我的提供程序中的重写方法:

@Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        int tableindex = (int) (ContentUris.parseId(uri));

    if ((tableindex > 0) && (tableindex <= numProviderDataList.size())) {
        numProviderDataType Data = numProviderDataList.get(tableindex - 1);

        Data.value = values.getAsInteger(numColumnNames[VALUE]);


        // Log.e("Provider1", Float.toString(Data.mValue1));
        // Log.e("Provider2", Float.toString(Data.mValue2));
    }

    getContext().getContentResolver().notifyChange(uri, null);

    return 1;
}

@Override
public ContentProviderResult[] applyBatch(
        ArrayList<ContentProviderOperation> ops)
        throws OperationApplicationException {
    // TODO Auto-generated method stub
    ContentProviderResult[] result;
    try{
    result = super.applyBatch(ops); //Does this call my provider's update() method?

    } catch(OperationApplicationException e){
        throw e;
    }
    //let observer know there's been a change at the URI
    getContext().getContentResolver().notifyChange(NUM_PROVIDER_MODEL_URI, null);
    return result;

然后如何从 ops ArrayList 中获取数据,以便将其放入我的存储结构中?在这种情况下,它是一个简单的数组。被覆盖的 applyBatch() 中的 super.applyBatch() 是否认识到它们都是更新 ContentProviderOperations,然后在我的操作 ArrayList 中为 ContentProviderOperation 调用我的提供者的覆盖更新方法?我找不到任何使用自定义提供程序的示例。

【问题讨论】:

    标签: android android-contentprovider


    【解决方案1】:

    applyBatch 的默认实现将迭代 ContentProviderOperation 数组并在每个数组上调用 apply,然后依次调用您的提供者的 insertupdatedelete 方法。

    所以是的,默认情况下它会调用你重写的方法。

    似乎无法从ContentProviderOperation 中提取数据,只能调用 apply 。覆盖applyBatch 只能用于过滤或排序操作。除此之外,您应该只依赖您的 insertupdatedelete 实现。

    【讨论】:

      猜你喜欢
      • 2011-09-25
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 2011-02-04
      • 2012-03-28
      相关资源
      最近更新 更多