2011-01-11 9 views
35

Nie mogę znaleźć dokładnej semantyki withValueBackReference.Jaka jest semantyka parametru withValueBackReference?

Przeczytałem przykładowy kod (na przykład kod, który dodaje nowy kontakt) przy użyciu tej metody, podając wartość backReference 0. Co to oznacza?

Dokumentacja mówi:

Wartość kolumna z odniesieniami tyłu ma pierwszeństwo przed wartością określoną w withValues ​​(ContentValues)

+0

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

Odpowiedz

155

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.

+4

To było nienaganne wyjaśnienie. Dzięki za tonę! Jak chciałbym móc głosować więcej niż raz. – curioustechizen

+3

To jest złoto, jedno z niewielu przyzwoitych wyjaśnień na temat backReferences, które widziałem. Zrobiłem to zaimplementowane w mojej aplikacji - dzięki –

+0

Najlepsza odpowiedź, dziękuję bardzo, dobrze będzie mieć flagę z gwiazdą, na którą możesz umieścić tylko 5 odpowiedzi :) Zdecydowanie posiadasz jedną! – Goofyahead

Powiązane problemy