withValueBackReference 的语义是什么? [英] What are the semantics of withValueBackReference?

查看:29
本文介绍了withValueBackReference 的语义是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法弄清楚 withValueBackReference.

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

I've read the example code (for example the code which adds a new contact) using this method, providing a backReference value of 0. What does this mean?

文档说:

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

A column value from the back references takes precedence over a value specified in withValues(ContentValues)

推荐答案

此问题与对内容提供程序的批处理操作有关.该示例是从这个相关问题修改而来的.

This question relates to batch operation on a content provider. The example is modified from this related question.

创建一批操作时,首先创建一个要执行的操作列表:

When creating a batch of operations first create a list of operations to perform using:

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

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

then apply them to the content provider using the applyBatch method.

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

这是基本概念,所以让我们应用它.假设我们有一个内容提供程序,它处理 Foo 记录和一些名为 Bar 的子记录的 uri.

That is the basic concept so let's apply it. Suppose we have a content provider which handles uris for Foo records and some child records called Bar.

content://com.stackoverflow.foobar/foo

content://com.stackoverflow.foobar/foo

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

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

现在我们只插入 2 个名为Foo A"的新 Foo 记录;和Foo B",这是示例.

For now we'll just insert 2 new Foo recordscalled "Foo A" and "Foo B", here's the example.

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 项目添加到我们的列表中,然后将列表应用到我们的内容提供者.结果数组填充了我们刚刚插入的新记录的 id.

Nothing special here, we are adding 2 ContentProviderOperation items to our list and then applying the list to our content provider. The results array filled with the id's of the new records that we have just inserted.

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

So say we wanted to do something similar but we also want to add some child records into our content provider in one batch operation. We want to attach the child records to the Foo records we just created. The problem is we don't know the id of the parent Foo records because the batch has not been run. This is where the withValueBackReference helps us. Let's see an example:

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 之前插入相关记录.后向引用索引只是将返回我们要查找的 id 的操作的索引.根据您希望包含 id 的结果来考虑它可能更容易.例如 results[1] 将包含Foo B"的 id所以我们用来反向引用Foo B"的索引是 1.

So the withValueBackReference() method allows us to insert the related records before we know the id of the parent we want to relate them to. The back reference index is simply the index of the operation that will return the id we want to look for. It is perhaps easier to think of it in terms of which result you would expect to contain the id. e.g results[1] would contain the id for "Foo B" so the index we use to back reference to "Foo B" is 1.

这篇关于withValueBackReference 的语义是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆