To pytanie odnosi się do operacji wsadowych na dostawcy treści. Przykład został zmieniony z this related question.
Podczas tworzenia partii operacji najpierw utworzyć listę czynności do wykonania przy użyciu:
ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
następnie zastosować je do dostawcy treści, stosując metodę applyBatch.
ContentProviderResult[] results = this.getContentResolver().applyBatch(FooBar.AUTHORITY, operations);
To jest podstawowa koncepcja, więc zastosujmy ją. Załóżmy, że mamy dostawcę treści, który obsługuje uris dla rekordów Foo i niektórych rekordów podrzędnych o nazwie Bar.
treść: //com.stackoverflow.foobar/foo
treść: //com.stackoverflow.foobar/foo/#/bar
Teraz musimy po prostu wstawić 2 nowe rekordy Foo zwane "Foo A" i "Foo B", oto przykład.
ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
//add a new ContentProviderOperation - inserting a FOO record with a name and a decscription
operations.add(ContentProviderOperation.newInsert(intent.getData())
.withValue(FOO.NAME, "Foo A")
.withValue(FOO.DESCRIPTION, "A foo of impeccable nature")
.build());
//let's add another
operations.add(ContentProviderOperation.newInsert(intent.getData())
.withValue(FOO.NAME, "Foo B")
.withValue(FOO.DESCRIPTION, "A foo of despicable nature")
.build());
ContentProviderResult[] results = this.getContentResolver().applyBatch(FooBar.AUTHORITY, operations);
Nic specjalnego tutaj, dodajemy 2 pozycji ContentProviderOperation do naszej listy, a następnie zastosowanie listę do naszego dostawcy treści. Tablica wyników wypełniła się identyfikatorami nowych rekordów, które właśnie wprowadziliśmy.
Powiedzmy, że chcieliśmy zrobić coś podobnego, ale chcemy dodać kilka rekordów podrzędnych do naszego dostawcy treści w jednej operacji wsadowej. Chcemy dołączyć rekordy podrzędne do nowo utworzonych rekordów Foo. Problem polega na tym, że nie znamy identyfikatora macierzystych rekordów Foo, ponieważ partia nie została uruchomiona. Tutaj pomaga nam metoda withValueBackReference. Zobaczmy przykład:
ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
//add a new ContentProviderOperation - inserting a Foo record with a name and a decscription
operations.add(ContentProviderOperation.newInsert(intent.getData())
.withValue(FOO.NAME, "Foo A")
.withValue(FOO.DESCRIPTION, "Foo of impeccable nature")
.build());
//let's add another
operations.add(ContentProviderOperation.newInsert(intent.getData())
.withValue(FOO.NAME, "Foo B")
.withValue(FOO.DESCRIPTION, "Foo of despicable nature")
.build());
//now add a Bar record called [Barbarella] and relate it to [Foo A]
operations.add(ContentProviderOperation.newInsert(intent.getData()
.buildUpon()
.appendPath("#") /* We don't know this yet */
.appendPath("bar")
.build())
.withValueBackReference (BAR.FOO_ID, 0) /* Index is 0 because Foo A is the first operation in the array*/
.withValue(BAR.NAME, "Barbarella")
.withValue(BAR.GENDER, "female")
.build());
//add a Bar record called [Barbarian] and relate it to [Foo B]
operations.add(ContentProviderOperation.newInsert(intent.getData()
.buildUpon()
.appendPath("#") /* We don't know this yet */
.appendPath("bar")
.build())
.withValueBackReference (BAR.FOO_ID, 1) /* Index of parent Foo B is 1*/
.withValue(BAR.NAME, "Barbarian")
.withValue(BAR.GENDER, "male")
.build());
ContentProviderResult[] results = this.getContentResolver().applyBatch(FooBar.AUTHORITY, operations);
Więc metoda withValueBackReference() pozwala nam wstawić związane rekordy przed wiemy id rodzica chcemy je odnosić. Indeks referencji zwrotnej jest po prostu indeksem operacji, która zwróci identyfikator, którego chcemy szukać. Być może łatwiej jest o tym myśleć w kategoriach tego, który wynik powinien zawierać identyfikator. np. results[1]
zawierałby identyfikator dla "Foo B", więc indeks, którego używamy do powrotu do "Foo B" to 1.
Znalazłem tę dyskusję na SO - mówi o użyciu metody withValueBackReference w przypadku, gdy cel jest zapisywanie * zarówno rekordów głównych, jak i szczegółowych * w pojedynczej operacji. Jednak nadal nie rozumiem, jak wartość referencyjna 0 cyfr tutaj! http://stackoverflow.com/questions/3224857/master-detail-using-contentresolver-applybatch – curioustechizen