यह सवाल एक सामग्री प्रदाता पर बैच आपरेशन से संबंधित है पर पूर्वता लेता है। उदाहरण this related question से संशोधित किया गया है।
जब पहली बार का उपयोग कर प्रदर्शन करने के लिए आपरेशन की एक सूची बना संचालन का एक बैच बनाने:
ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
तो applyBatch विधि का उपयोग कर सामग्री प्रदाता करने के लिए उन्हें लागू होते हैं।
ContentProviderResult[] results = this.getContentResolver().applyBatch(FooBar.AUTHORITY, operations);
है कि मूल अवधारणा तो चलो इसे लागू करते हैं। मान लें कि हमारे पास एक सामग्री प्रदाता है जो फू रिकॉर्ड्स और बार नामक कुछ बाल रिकॉर्ड के लिए यूरीज़ को संभालता है।
सामग्री: //com.stackoverflow.foobar/foo
सामग्री: //com.stackoverflow.foobar/foo/#/bar
अब हम सिर्फ 2 प्रविष्ट किए जाने वाले के लिए नए फू रिकॉर्ड "फू ए" और "फू बी" रिकॉर्ड किया गया, यहां उदाहरण है।
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 आइटम जोड़ रहे हैं और फिर हमारे सामग्री प्रदाता को सूची को लागू करने। आईडी के नए रिकॉर्ड के आईडी से भरा परिणाम सरणी जिसे हमने अभी डाला है।
तो कहें कि हम कुछ ऐसा करना चाहते हैं लेकिन हम एक बैच ऑपरेशन में हमारे सामग्री प्रदाता में कुछ बाल रिकॉर्ड भी जोड़ना चाहते हैं। हम अपने द्वारा बनाए गए फू रिकॉर्ड्स में बाल रिकॉर्ड संलग्न करना चाहते हैं। समस्या यह है कि हम अभिभावक फू रिकॉर्ड की आईडी नहीं जानते हैं क्योंकि बैच नहीं चलाया गया है। यह वह जगह है जहां 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() विधि इससे पहले कि हम माता-पिता हम उन्हें से संबंधित करना चाहते हैं उसका आईडी पता हमें संबंधित अभिलेख सम्मिलित करने के लिए अनुमति देता है। बैक रेफरेंस इंडेक्स केवल ऑपरेशन की अनुक्रमणिका है जो उस आईडी को वापस लाएगा जिसे हम देखना चाहते हैं। इसके बारे में सोचना शायद आसान है जिसके परिणामस्वरूप आप आईडी को शामिल करने की अपेक्षा करेंगे। उदाहरण के लिए results[1]
में "फू बी" के लिए आईडी होगी, इसलिए "फू बी" के संदर्भ में हम जिस इंडेक्स का उपयोग करते हैं, वह है 1.
मुझे यह चर्चा एसओ पर मिली - यह उस मामले में ValueBackReference विधि का उपयोग करने के बारे में बात करता है जहां उद्देश्य एक ही ऑपरेशन में * मास्टर और विवरण रिकॉर्ड * दोनों को बचाने के लिए है। हालांकि, मैं अभी भी समझ नहीं पा रहा हूं कि यहां 0 आंकड़े का पिछला संदर्भ मूल्य कैसा है! http://stackoverflow.com/questions/3224857/master-detail-using-contentresolver-applybatch – curioustechizen