【发布时间】: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