2010-07-11 11 views
21

Me preguntaba si es posible guardar registros maestros y de detalles a un proveedor de contenido utilizando el método android.content.ContentResolver.applyBatch() en la misma operación donde los elementos subsiguientes ContentProviderOperation en el parámetro proveedores dependen del resultado de elementos anteriores . Master-detail Using ContentResolver.applyBatch()?

El problema que estoy teniendo es que el Uri actual no se conoce en el momento en que el método ContentProviderOperation.newInsert (Uri) es llamado y el URI es inmutable.

Lo que he llegado con que se muestra a continuación:

Maestro Uri: contenido: //com.foobar.masterdetail/master
Detalle Uri: contenido: //com.foobar. MasterDetail/maestro/#/detalle

ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(); 
operations.add(ContentProviderOperation.newInsert(intent.getData()) 
    .withValue(Master.NAME, "") 
    .withValue(Master.VALUE, "") 
    .build()); 
operations.add(ContentProviderOperation.newInsert(intent.getData() 
     .buildUpon() 
     .appendPath("#") /* ACTUAL VALUE NOT KNOWN UNTIL MASTER ROW IS SAVED */ 
     .appendPath("detail") 
     .build()) 
    .withValue(Detail.MASTER_ID, /* WHAT GOES HERE? */) 
    .withValue(Detail.NAME, "") 
    .withValue(Detail.VALUE, "") 
    .build()); 
ContentProviderResult[] results = this.getContentResolver().applyBatch(MasterDetail.AUTHORITY, operations); 
for (ContentProviderResult result : results) { 
    Uri test = result.uri; 
} 

en mi proveedor de contenido, estoy reemplazando el método applyBatch() con el fin de envolver los operati en una transacción.

¿Es posible o hay una mejor manera de hacerlo?

Gracias.

+0

por favor, ¿cree que podría compartir su código para insertar registros de detalles maestros? He estado tratando desesperadamente de encontrar información sobre esto durante casi una semana. – eddy

Respuesta

17

Cada resultado producido a partir de un elemento en la matriz de operaciones se identifica por su índice en la matriz. Las operaciones posteriores pueden hacer referencia a esos resultados a través del método withValueBackReference().

.withValue(Detail.MASTER_ID, /* WHAT GOES HERE? */) 

convierte

.withValueBackReference(Detail.MASTER_ID, 0) 

Un ejemplo completo de este uso se puede encontrar en sample ContactManager. El 0 es el índice del ContentProviderOperation del que se obtiene el valor.

+0

¿Cómo puedo descargar los proyectos de muestra? No puedo ver ningún enlace de descarga – eddy

+0

http://stackoverflow.com/questions/4655291/semantics-of-withvaluebackreference – phreed