Es ist möglich, transaktionsbasierte Multi-Table-Inserts seit Android 2.1 ziemlich sauber durchzuführen, indem man ContentProviderOperation verwendet, wie von kaciula erwähnt.
Wenn Sie das ContentProviderOperation-Objekt erstellen, können Sie .withValueBackReference(fieldName, refNr) aufrufen. Wenn die Operation mit applyBatch angewandt wird, hat dies zur Folge, dass dem ContentValues-Objekt, das mit dem insert()-Aufruf geliefert wird, eine Ganzzahl injiziert wird. Die Ganzzahl wird mit dem String fieldName verschlüsselt, und ihr Wert wird aus dem ContentProviderResult einer zuvor angewendeten ContentProviderOperation abgerufen, indiziert durch refNr.
Bitte beachten Sie das unten stehende Codebeispiel. In dem Beispiel wird eine Zeile in Tabelle 1 eingefügt, und die daraus resultierende ID (in diesem Fall "1") wird dann als Wert beim Einfügen der Zeile in Tabelle 2 verwendet. Der Kürze halber wird der ContentProvider nicht mit einer Datenbank verbunden. Im ContentProvider gibt es Ausdrucke, bei denen es sinnvoll wäre, das Transaktionshandling hinzuzufügen.
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
}
2 Stimmen
Siehe dies: stackoverflow.com/questions/4655291/
0 Stimmen
Haben Sie jemals eine Lösung für dieses Problem gefunden? Ich kann keine Lösung finden, die funktioniert