¿Cuál es la semántica de withValueBackReference?

No puedo entender la semántica exacta de withValueBackReference .

He leído el código de ejemplo (por ejemplo, el código que agrega un nuevo contacto) usando este método, proporcionando un valor de referencia inversa de 0. ¿Qué significa esto?

La documentación dice:

Un valor de columna de las referencias anteriores tiene prioridad sobre un valor especificado en withValues ​​(ContentValues)

Esta pregunta se refiere a la operación por lotes en un proveedor de contenido. El ejemplo se modifica a partir de esta pregunta relacionada .

Al crear un lote de operaciones, primero cree una lista de operaciones para realizar utilizando:

ArrayList operations = new ArrayList(); 

luego, aplíquelos al proveedor de contenidos utilizando el método applyBatch.

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

Ese es el concepto básico, así que vamos a aplicarlo. Supongamos que tenemos un proveedor de contenido que maneja los uris para los registros Foo y algunos registros secundarios llamados Bar.

contenido: //com.stackoverflow.foobar/foo

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

Por ahora solo insertaremos 2 nuevos registros Foo llamados “Foo A” y “Foo B”, aquí está el ejemplo.

 ArrayList operations = new ArrayList(); //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); 

Nada especial aquí, estamos agregando 2 elementos de ContentProviderOperation a nuestra lista y luego aplicando la lista a nuestro proveedor de contenido. El conjunto de resultados se llenó con los id de los nuevos registros que acabamos de insertar.

Entonces, digamos que queríamos hacer algo similar, pero también queremos agregar algunos registros secundarios en nuestro proveedor de contenido en una operación por lotes. Queremos adjuntar los registros secundarios a los registros Foo que acabamos de crear. El problema es que no conocemos la identificación de los registros Foo padre porque el lote no se ha ejecutado. Aquí es donde nos ayuda withValueBackReference. Veamos un ejemplo:

 ArrayList operations = new ArrayList(); //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); 

Entonces, el método withValueBackReference () nos permite insertar los registros relacionados antes de conocer la identificación del padre con el que queremos relacionarlos. El índice de referencia posterior es simplemente el índice de la operación que devolverá el ID que queremos buscar. Es quizás más fácil pensar en términos de qué resultado esperaría contener la identificación. por ejemplo, los results[1] contendrían la identificación de “Foo B”, por lo que el índice que usamos para hacer referencia a “Foo B” es 1.