39 votes

La sémantique de withValueBackReference?

J'ai lu les docs plusieurs fois, mais je ne peux toujours pas comprendre la sémantique exacte de withValueBackReference.

Je vois que certains l'exemple de code (par exemple le code qui ajoute un nouveau contact) à l'aide de cette méthode, en fournissant une référence arrière de la valeur de 0. Qu'est-ce que cela signifie?

Les docs ont ceci à dire:

La valeur d'une colonne à partir de l'arrière références prioritaire par rapport à une valeur spécifiée dans withValues(ContentValues)

Toute aide est grandement appréciée.

162voto

Merlin Points 7678

Cette question se rapporte à l'opération de traitement sur un fournisseur de contenu. L'exemple est modifié à partir de cette question.

Lors de la création d'un lot d'opérations d'abord créer une liste d'opérations à effectuer à l'aide de:

ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();

puis les appliquer au fournisseur de contenu à l'aide de la applyBatch méthode.

ContentProviderResult[] results = this.getContentResolver().applyBatch(FooBar.AUTHORITY, operations);

C'est le concept de base donc, nous allons l'appliquer. Supposons que nous avons un fournisseur de contenu qui s'occupe de l'uri pour les Foo dossiers et certains enregistrements enfant appelé à la Barre.

content://com.stackoverflow.foobar/foo

content://com.stackoverflow.foobar/foo/#/bar

Pour l'instant, nous allons simplement insérer 2 new Foo recordscalled "Foo" et de "Foo B", voici l'exemple.

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

Rien de spécial ici, nous sommes, en ajoutant 2 ContentProviderOperation éléments de notre liste et ensuite appliquer la liste de notre fournisseur de contenu. Les résultats de tableau rempli avec l'id de la nouvelle enregistrements que nous avons inséré.

Alors disons que nous voulions faire quelque chose de similaire, mais nous voulons aussi ajouter certains enregistrements enfants dans notre fournisseur de contenu en une seule opération par lots. Nous voulons fixer des enregistrements de l'enfant à la Foo dossiers que nous venons de créer. Le problème est que nous ne savons pas l'id du parent Foo enregistrements car le lot n'a pas été exécuté. C'est là que le withValueBackReference nous aide. Voyons un exemple:

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

Ainsi, le withValueBackReference() méthode qui nous permet d'insérer les documents connexes avant de nous connaître l'id du parent nous voulons rapporter à. Le dos de l'index de référence est simplement l'indice de l'opération qui sera de retour l'id que nous voulons voir pour. C'est peut-être plus facile de penser en termes de résultat de qui vous attendez à contenir l'id. e.g results[1] contiendra l'id de "Foo B" de sorte que l'indice que nous utilisons pour revenir référence à "Foo B" est 1.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X