2011-01-11 10 views
35

withValueBackReferenceの正確なセマンティクスを把握することはできません。withValueBackReferenceのセマンティクスは何ですか?

このメソッドを使用して、例のコード(たとえば、新しい連絡先を追加するコード)を読んで、backReference値0を指定しました。これはどういう意味ですか?

ドキュメントは言う:

後方参照の列の値がwithValues(ContentValues)で指定された値よりも優先されます

+0

私はこの議論をSOで見つけました。これはwithValueBackReferenceメソッドを目的マスターレコードと詳細レコード*を1回の操作で保存することです。しかし、私はまだ0参照のバックリファレンス値がここにどのように理解していない! http://stackoverflow.com/questions/3224857/master-detail-using-contentresolver-applybatch – curioustechizen

答えて

155

この質問は、コンテンツプロバイダにバッチ処理に関するものです。この例はthis related questionから変更されています。まず使用して実行する操作のリストを作成する操作のバッチを作成する場合

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

次いでapplyBatch法を使用してコンテンツプロバイダにそれらを適用します。

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

これは基本的な概念ですので、それを適用しましょう。 FooレコードのurisとBarという子レコードのいくつかを扱うコンテンツプロバイダがあるとします。

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

内容:今、私たちはわずか2を挿入しますについて

//com.stackoverflow.foobar/foo/#/bar新しいFooは "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項目を追加し、当社のコンテンツプロバイダーにリストを適用しています。結果の配列は、挿入したばかりの新しいレコードのidで埋められます。

私たちは同様のことをしたいと考えていますが、一度のバッチ操作でいくつかの子レコードをコンテンツプロバイダに追加したいとします。先ほど作成したFooレコードに子レコードを添付します。問題は、バッチが実行されていないため、親Fooレコードの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を知っている前に、関連レコードを挿入することを可能にします。後方参照インデックスは、単に私たちが探したいidを返す操作のインデックスです。おそらく、あなたがIDを含むと予想される結果を考えて考える方が簡単でしょう。たとえばresults[1]には "Foo B"のIDが含まれているので、 "Foo B"への参照を使用するインデックスは1です。

+4

これは完璧な説明でした。ありがとう、トン!私は何回もupvoteできますか? – curioustechizen

+3

これは私が見たbackReferencesの唯一のまともな説明の1つです。それは私のアプリで実装されました - ありがとう –

+0

これまで最高の答えは、ありがとう、それは5つの応答に入れることができる星の旗を持っていることが良いでしょう:) あなたは間違いなく1つを所有しています! – Goofyahead

関連する問題