2010-07-11 3 views
21

Ich frage mich, ob es möglich ist, Master- und Detaildatensätze mit der Methode android.content.ContentResolver.applyBatch() im selben Vorgang an einen Inhaltsanbieter zu speichern, wenn nachfolgende ContentProviderOperation-Elemente im providers-Parameter vom Ergebnis vorheriger Elemente abhängen . Master-Detail Verwenden von ContentResolver.applyBatch()?

Das Problem, das ich habe, ist, dass die tatsächliche Uri nicht an der Zeit ist bekannt, dass die ContentProviderOperation.newInsert (Uri) Methode aufgerufen wird und die Uri ist unveränderlich.

Was ich gekommen sind mit unten dargestellt:

Meister Uri: Inhalt: //com.foobar.masterdetail/master
Details Uri: Inhalt: //com.foobar. Masterdetail/Master/#/Detail

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; 
} 

in meinem Content-Provider, ich bin das Überschreiben der applyBatch() -Methode, um die operati zu wickeln in einer Transaktion.

Ist dies möglich oder gibt es einen besseren Weg dies zu tun?

Danke.

+0

Bitte denken Sie, Sie könnten Ihren Code für das Einfügen von Master-Detail-Datensätze teilen. Ich habe verzweifelt versucht, fast eine Woche lang Informationen darüber zu finden. – eddy

Antwort

17

Jedes Ergebnis eines Elements im Operations-Array wird durch seinen Index im Array identifiziert. Nachfolgende Operationen können diese Ergebnisse über die Methode withValueBackReference() referenzieren.

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

wird

.withValueBackReference(Detail.MASTER_ID, 0) 

Ein vollständiges Beispiel für diese Verwendung in sample ContactManager finden. Die 0 ist der Index der ContentProviderOperation, von der der Wert abgerufen wird.

+0

Wie kann ich die Beispielprojekte herunterladen? Ich kann keine Download-Links – eddy

+0

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