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,这又会调用您的提供商的 insert
、update
或delete
方法。
所以是的,它会默认调用您重写的方法。
似乎无法从 ContentProviderOperation
中提取数据,只能调用应用程序。覆盖 applyBatch
应该只用于过滤或排序操作。除此之外,您应该只依赖于您的 insert
、update
或 delete
实现。
我正在尝试在自定义内容提供程序上使用重写的 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,这又会调用您的提供商的 insert
、update
或delete
方法。
所以是的,它会默认调用您重写的方法。
似乎无法从 ContentProviderOperation
中提取数据,只能调用应用程序。覆盖 applyBatch
应该只用于过滤或排序操作。除此之外,您应该只依赖于您的 insert
、update
或 delete
实现。