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.