withValueBackReference的语义是什么?

我无法弄清withValueBackReference的确切语义。

我已经阅读了使用此方法的示例代码(例如添加新联系人的代码),并提供了backReference值0.这是什么意思?

该文件说:

来自后向引用的列值优先于withValues(ContentValues)中指定的值

这个问题涉及内容提供者的批量操作。 这个例子是从这个相关的问题修改的。

在创build一批操作时,首先要创build一个操作列表来执行使用:

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

然后使用applyBatch方法将它们应用于内容提供者。

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

这是基本的概念,所以让我们应用它。 假设我们有一个内容提供者处理用于Foologging的uris和一些名为Bar的子logging。

内容://com.stackoverflow.foobar/foo

内容://com.stackoverflow.foobar/foo/#/bar

现在我们将插入2个新的Foologging,这个logging叫做“Foo A”和“Foo B”,这里是例子。

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

这里没什么特别的,我们将2个ContentProviderOperation项目添加到我们的列表,然后将列表应用到我们的内容提供者。 结果数组填充了我们刚插入的新logging的id。

所以说,我们想做类似的事情,但我们也想在一个批处理操作中添加一些子logging到我们的内容提供者。 我们希望将子logging附加到我们刚刚创build的Foologging。 问题是我们不知道父Foologging的id,因为批处理尚未运行。 这是withValueBackReference帮助我们的地方。 我们来看一个例子:

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

因此,withValueBackReference()方法允许我们在知道我们想要关联父对象的ID之前插入相关logging。 反向引用索引只是将返回我们要查找的id的操作的索引。 根据你期望包含id的结果来考虑它可能更容易。 例如results[1]将包含“Foo B”的ID,所以我们用来反引用“Foo B”的索引是1。