Il est possible de faire des insertions multi-tables basées sur les transactions de manière plutôt simple depuis Android 2.1 en utilisant ContentProviderOperation, comme mentionné par kaciula. Lorsque vous générez l'objet ContentProviderOperation, vous pouvez appeler .withValueBackReference (fieldName, refNr).
Lorsque vous générez l'objet ContentProviderOperation, vous pouvez appeler .withValueBackReference (fieldName, refNr). Lorsque l'opération est appliquée en utilisant applyBatch, le résultat est que l'objet ContentValues fourni avec l'appel insert() aura un entier injecté. L'entier sera calée avec la chaîne fieldName, et sa valeur est extraite de la ContentProviderResult d'un ContentProviderOperation appliqué précédemment, indexé par Refnr.
Veuillez vous reporter à l'exemple de code ci-dessous. Dans l'exemple, une ligne est insérée dans le tableau 1, et l'ID résultant (dans ce cas « 1 ») est ensuite utilisée en tant que valeur lors de l'insertion de la rangée dans le tableau 2. Par souci de concision, le ContentProvider 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
}
voir ceci: http://stackoverflow.com/questions/4655291/semantics-of-withvaluebackreference –
Avez-vous trouvé jamais une solution à cela? Je ne peux pas trouver une solution qui fonctionne – jamesc