Il est possible d'effectuer des insertions multi-tables basées sur des transactions de manière assez propre depuis Android 2.1 en utilisant ContentProviderOperation, comme mentionné par kaciula.
Lorsque vous construisez l'objet ContentProviderOperation, vous pouvez appeler .withValueBackReference(fieldName, refNr). Lorsque l'opération est appliquée à l'aide de applyBatch, le résultat est que l'objet ContentValues qui est fourni avec l'appel insert() aura un entier injecté. Le nombre entier est associé à la chaîne fieldName et sa valeur est récupérée dans le ContentProviderResult d'une ContentProviderOperation appliquée précédemment, indexée par refNr.
Veuillez vous référer à l'exemple de code ci-dessous. Dans cet exemple, une ligne est insérée dans la table 1, et l'ID résultant (dans ce cas "1") est ensuite utilisé comme valeur lors de l'insertion de la ligne dans la table 2. Pour des raisons de brièveté, le ContentProvider n'est pas connecté à une base de données. Dans le ContentProvider, il y a des impressions où il serait approprié d'ajouter la gestion des transactions.
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
}