2016-11-04 46 views
1

我想在自定義contentprovider上使用overrided applyBatch()方法。我知道它通過了ContentProviderOperations的ArrayList。在我的情況下,他們都更新ContentProviderOperations。在我的提供者中,我想更新一個簡單的數組中的數據(現在是我的替身數據庫),它首先插入到ContentProviderOperation.Builder中。Android ContentProvider和ContentProviderOperation.newUpdate()

重要的代碼位至今:

當我建立我的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; 

然後,我如何從操作ArrayList中獲取數據,以便將其放入存儲結構中?在這種情況下,它是一個簡單的數組。被覆蓋的applyBatch()中的super.applyBatch()是否意識到它們都是更新ContentProviderOperations,然後在我的操作ArrayList中調用我的提供者的ContentProviderOperation的覆蓋更新方法?我找不到任何使用自定義提供程序的示例。

回答

0

applyBatch默認實現迭代ContentProviderOperation陣列和呼叫適用於每個人,這反過來會打電話給你的供應商的insertupdatedelete方法。

所以是的,它會默認調用你重寫的方法。

似乎無法從ContentProviderOperation中提取數據,只能調用適用於它的數據。重寫applyBatch應該只用於過濾或訂購操作。除此之外,您應該只依靠您的insert,updatedelete實現。