Es posible realizar insertos de tabla múltiple basados en transacciones de forma bastante limpia desde Android 2.1 mediante ContentProviderOperation, como lo menciona kaciula.
Cuando crea el objeto ContentProviderOperation, puede llamar a .withValueBackReference (fieldName, refNr). Cuando la operación se aplica con applyBatch, el resultado es que el objeto ContentValues que se suministra con la llamada insert() tendrá un entero insertado. El entero se tecleará con fieldName String, y su valor se recuperará del ContentProviderResult de un ContentProviderOperation aplicado previamente, indexado por refNr.
Consulte el siguiente ejemplo de código. En el ejemplo, se inserta una fila en la tabla 1, y la ID resultante (en este caso, "1") se usa como un valor al insertar la fila en la tabla 2. Por brevedad, ContentProvider no está conectado a una base de datos. En ContentProvider, hay impresiones donde sería adecuado agregar el manejo de transacciones.
public class BatchTestActivity extends Activity {
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ArrayList<ContentProviderOperation> list = new
ArrayList<ContentProviderOperation>();
list.add(ContentProviderOperation.
newInsert(BatchContentProvider.FIRST_URI).build());
ContentValues cv = new ContentValues();
cv.put("name", "second_name");
cv.put("refId", 23);
// In this example, "refId" in the contentValues will be overwritten by
// the result from the first insert operation, indexed by 0
list.add(ContentProviderOperation.
newInsert(BatchContentProvider.SECOND_URI).
withValues(cv).withValueBackReference("refId", 0).build());
try {
getContentResolver().applyBatch(
BatchContentProvider.AUTHORITY, list);
} catch (RemoteException e) {
e.printStackTrace();
} catch (OperationApplicationException e) {
e.printStackTrace();
}
}
}
public class BatchContentProvider extends ContentProvider {
private static final String SCHEME = "content://";
public static final String AUTHORITY = "com.test.batch";
public static final Uri FIRST_URI =
Uri.parse(SCHEME + AUTHORITY + "/" + "table1");
public static final Uri SECOND_URI =
Uri.parse(SCHEME + AUTHORITY + "/" + "table2");
public ContentProviderResult[] applyBatch(
ArrayList<ContentProviderOperation> operations)
throws OperationApplicationException {
System.out.println("starting transaction");
ContentProviderResult[] result;
try {
result = super.applyBatch(operations);
} catch (OperationApplicationException e) {
System.out.println("aborting transaction");
throw e;
}
System.out.println("ending transaction");
return result;
}
public Uri insert(Uri uri, ContentValues values) {
// this printout will have a proper value when
// the second operation is applied
System.out.println("" + values);
return ContentUris.withAppendedId(uri, 1);
}
// other overrides omitted for brevity
}
ver esto: http://stackoverflow.com/questions/4655291/semantics-of-withvaluebackreference –
¿Alguna vez encontrar una solución a esto? No puedo encontrar una solución que funcione – jamesc