2014-09-12 6 views
8

मैं क्लाउडकिट के साथ कुछ रिकॉर्ड परिवर्तन अपलोड करने का प्रयास कर रहा हूं। मैं डिवाइस पर बदल चुके रिकॉर्ड के बैच अपलोड करने के लिए एक CKModifyRecordsOperation का उपयोग करने का प्रयास कर रहा हूं।क्लाउडकिट CKModifyRecordsOperation मुझे "सुरक्षा डेटा मेल नहीं खाता"

- (void)updloadLocalChangesWithCompletionBlock:(void (^)(NSError *error))completionBlock 
{ 
    // Initialize the data 
    NSArray *localChanges = self.localChanges; 
    NSArray *localDeletions = self.localDeletions; 

    // Initialize the database and modify records operation 
    CKDatabase *database = [CKContainer defaultContainer].privateCloudDatabase; 
    CKModifyRecordsOperation *modifyRecordsOperation = [[CKModifyRecordsOperation alloc] initWithRecordsToSave:localChanges recordIDsToDelete:localDeletions]; 
    modifyRecordsOperation.savePolicy = CKRecordSaveAllKeys; 

    NSLog(@"CLOUDKIT Changes Uploading: %d", localChanges.count); 

    // Add the completion block 
    modifyRecordsOperation.modifyRecordsCompletionBlock = ^(NSArray *savedRecords, NSArray *deletedRecordIDs, NSError *error) { 
     if (error) { 
      NSLog(@"[%@] Error pushing local data: %@", self.class, error); 
     } 

     [self.localChanges removeObjectsInArray:savedRecords]; 
     [self.localDeletions removeObjectsInArray:deletedRecordIDs]; 

     completionBlock(error); 
    }; 

    // Start the operation 
    [database addOperation:modifyRecordsOperation]; 
} 

यहाँ: रिकॉर्ड एक कस्टम क्षेत्र

किसी कारण आपरेशन मुझे बता "" संरक्षण डेटा से मेल नहीं खाती "

यहाँ एक त्रुटि के साथ वापस आ रहा रखता है के लिए सभी कोड है कर रहे हैं त्रुटि है यह मुझे दे रहा है:

[CloudKitSyncManager] Error Uploading Changes: <CKError 0x156654a0: "Partial Failure" (2/1011); "Failed to modify some records"; partial errors: { 
    default-00001:(ZoneName:UserRecordID) = <CKError 0x1550b5a0: "Server Record Changed" (14/2037); "Error saving record <CKRecordID: 0x18080430; default-00001:(ZoneName:UserRecordID)> to server: Protection data didn't match"> 
}> 

उत्तर

5

वास्तव में क्या आपके self.localChanges सरणी में है? CKRecord मुझे लगता है, लेकिन संशोधित रिकॉर्ड हैं जिन्हें आप क्लाउडकिट से डाउनलोड की गई सीकेआरकॉर्ड ऑब्जेक्ट्स के आधार पर अपलोड कर रहे हैं?

मेरे पास एक समान (हालांकि सटीक नहीं है) त्रुटि संदेश था जब मैंने अपने स्थानीय परिवर्तनों के साथ ताजा आवंटित सीकेआरकॉर्ड अपलोड करने का प्रयास किया और उम्मीद की कि वह सर्वर की प्रतिलिपि को ओवरराइट कर दे। मैंने इसे अपने आइटम की रिमोट कॉपी डाउनलोड करके, क्लाउडकिट द्वारा दिए गए सीकेआरकॉर्ड उदाहरण के अपडेट लागू करने और फिर इसे अपलोड करके तय किया।

+0

हां, वे सीके रिकॉर्ड्स थे और हां मैं मौजूदा लोगों को ओवरराइट करने के लिए ताजा सीके रिकॉर्ड्स का उपयोग कर रहा था और हाँ आपका समाधान काम करता था! दस्तावेज़ों में बहुत स्पष्ट नहीं था। ओह अच्छा। जवाब के लिए धन्यवाद! – Jonathan

2

आप चाहिए dashboa में इसी प्रकार के रिकार्ड के लिए सेट लिखने की अनुमति rd, मुझे लगता है।

enter image description here

+0

ऐसा करने के लिए नहीं सोचा था। बस इसे एक शॉट दिया और यह काम नहीं किया। – Jonathan

0

यह ध्यान देने योग्य है कि इसका समाधान दो गुना था। मैं एक कस्टम क्षेत्र का उपयोग करने की भी कोशिश कर रहा था। जहाँ भी मैं एक CKRecordZoneID आरंभ किया गया था कोड इस तरह देखा:

[[CKRecordZoneID alloc] initWithZoneName:@"CustomZoneName" ownerName:self.userRecordId.recordName]; 

यह इस

[[CKRecordZoneID alloc] initWithZoneName:@"CustomZoneName" ownerName:CKOwnerDefaultName]; 

की तरह देखा जाना चाहिए था मुझे विश्वास है कि यह है कि क्या कारण था "संरक्षण डाटा से मेल नहीं खाती का हिस्सा है बग ", लेकिन डेव तेरे द्वारा इसका जवाब भी आवश्यक था।

7

आप CKRecordSaveIfServerRecordUnchanged की savePolicy उपयोग करते हैं, यह एक दूरस्थ CKRecord (और अद्यतन है कि विशेष उदाहरण) प्री-फ़ेच CKModifyRecordsOperation से पहले आवश्यक है। यदि आप एक "स्थानीय" CKRecord आवंटित करते हैं और इसे के माध्यम से initWithRecordName: मिलान के साथ संदर्भित करते हैं, तो क्लाउडकिट दूरस्थ परिवर्तन-टैग की तुलना किसी स्थानीय (लापता) स्थानीय परिवर्तन-टैग से नहीं कर सकता है, इसलिए यह CKErrorServerRecordChanged और कुछ हद तक अस्पष्ट त्रुटि संदेश में विफल रहता है: "सुरक्षा डेटा मेल नहीं खाता"।

हालांकि, अगर रिमोट CKRecord बिल्कुल मौजूद नहीं है, निश्चित रूप से सर्वर रिकॉर्ड नहीं बदला है और सहेजने का कार्य आगे बढ़ सकता है। यह व्यवहार "सहेजें अगर मौजूद नहीं है" केस का उपयोग करें (SQL: एक प्राथमिक कुंजी पर INSERT)। यदि आप एक "स्थानीय" CKRecord आवंटित करते हैं और CKRecordSaveIfServerRecordUnchanged का उपयोग करते हैं, तो यह INSERT होगा, लेकिन कभी अपडेट नहीं होगा।

आप CKRecordSaveAllKeys की savePolicy और CKOwnerDefaultName की CKRecordZoneIDownerName उपयोग करते हैं, आप को बचाने के लिए सक्षम होना चाहिए: के माध्यम से एक "स्थानीय रूप से" (एसक्यूएल, अद्यतन सम्मिलित करें यदि आवश्यक हो तो) के साथ CKRecord आवंटित, एक (प्री-फ़ेच) यात्रा की बचत नेटवर्क पर

"सहेजें अगर मौजूद है" केस का उपयोग करें (SQL: एक प्राथमिक कुंजी पर अद्यतन) शायद नेटवर्क पर एक (सत्यापन) यात्रा के बिना नहीं किया जा सकता है।

कैच: यह, दोनों एक CKRecordSaveIfServerRecordUnchanged सम्मिलित करें और एक परमाणु सौदे में एक CKRecordSaveAllKeys अद्यतन रोल करने के बाद से CloudKit लेनदेन अवधि केवल एक ही CKModifyRecordsOperation, कई भर में CKRecord/CKRecordID उदाहरणों संभव नहीं है। दार्शनिक रूप से बोलते हुए, एक "लेनदेन" कई "संचालन" (एसक्यूएल: प्रश्न) फैलाने में सक्षम होना चाहिए, न केवल एकाधिक "रिकॉर्ड" (एसक्यूएल: पंक्तियां)।

संबंधित मुद्दे