Android 内容提供者和 ContentProviderOperation.newUpdate()

Android ContentProvider and ContentProviderOperation.newUpdate()

我正在尝试在自定义内容提供程序上使用重写的 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?我找不到任何使用自定义提供程序的示例。

applyBatch 的默认实现将遍历 ContentProviderOperation 数组并在每个数组上调用 apply,这又会调用您的提供商的 insertupdatedelete 方法。

所以是的,它会默认调用您重写的方法。

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