2015-02-09 4 views
10

मैं वर्तमान में CloudKit मेरे एप्लिकेशन में सेट करें जिससे मैं नीचे निम्न कोड की मदद का उपयोग कर एक नया रिकार्ड द्वारा जोड़ा जा रहा मिला है,क्लाउडकिट: सभी रिकॉर्ड एक निश्चित रिकॉर्ड प्रकार के साथ प्राप्त करें?

CKRecordID *recordID = [[CKRecordID alloc] initWithRecordName:@"stringArray"]; 
CKRecord *record = [[CKRecord alloc] initWithRecordType:@"Strings" recordID:recordID]; 
[record setObject:[NSArray arrayWithObjects:@"one", @"two", @"three", @"four", nil] forKey:@"stringArray"]; 
[_privateDatabase saveRecord:record completionHandler:nil]; 

हालांकि, अब मैं सभी को लाने के लिए सक्षम होने के लिए चाहते हैं रिकॉर्ड जो एक ही रिकॉर्ड प्रकार के हैं, "स्ट्रिंग्स", और एनएसएआरएआरई में संकलित किए गए लौटें। मुझसे यह कैसे होगा? वर्तमान में, मुझे पता चला है कि प्रत्येक रिकॉर्ड को व्यक्तिगत रूप से कैसे प्राप्त किया जाए, रिकॉर्ड आईडी का उपयोग करके, जो परेशानी है, वहां एक आसान तरीका होना चाहिए।

[_privateDatabase fetchRecordWithID:recordID completionHandler:^(CKRecord *record, NSError *error) { 
    if (error) { 
     // Error handling for failed fetch from private database 
    } 
    else { 
     NSLog(@"ICLOUD TEST: %@", [record objectForKey:@"stringArray"]);    
    } 
}]; 
+0

CKQuery API संदर्भ के अनुसार: "विधेय आधारित हैं प्रारूप स्ट्रिंग पर। आप मान या ब्लॉक-आधारित भविष्यवाणियों का उपयोग नहीं कर सकते हैं। " मुझे नहीं लगता कि यह हमेशा ऐसा ही था, लेकिन वर्तमान में न तो जवाब सही होगा क्योंकि वे 'NSPredicate (value:)' –

+0

@JamesLingo का उपयोग करते हैं, क्या आपने इसे आजमाया है? क्या यह एक अनुमान है? 'NSPredicate (value: true) 'पूरी तरह ठीक है –

+0

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

उत्तर

8

Aaaand, मैं यह मिल गया है। नीचे दिए गए कोड का उपयोग करके, मैं डेटाबेस पर चलाने के लिए एक क्वेरी बनाने में सक्षम था, फिर पूरा करने वाले ब्लॉक में एक एनएसएआरएआरई वापस कर सकता था, जिसे मैंने लूप किया था, और एनएसएलओजी में सहेजी गई कुंजी के लिए मान वापस कर दिया था।

NSPredicate *predicate = [NSPredicate predicateWithValue:YES]; 
CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Strings" predicate:predicate]; 

[_privateDatabase performQuery:query inZoneWithID:nil completionHandler:^(NSArray *results, NSError *error) { 
    for (CKRecord *record in results) { 
     NSLog(@"Contents: %@", [record objectForKey:@"stringArray"]); 
    } 
}]; 
+1

यह सभी रिकॉर्ड वापस नहीं करेगा, बस एक सबसेट (आमतौर पर डिफ़ॉल्ट रूप से 100 तक सीमित) –

+0

@MaxDesiatov सीमित के साथ आपका क्या मतलब है? सभी को कैसे लाया जाए? – Ryde

+0

कभी भी ध्यान न दें, यह (100 सीमा) का उत्तर यहां दिया गया है: [link] (http://stackoverflow.com/questions/29592964/ckquery-from-private-zone-returns-only-first-100-ckrecords-from-in -क्लोडकिट) और [लिंक] (http://stackoverflow.com/questions/27728115/limit-the-amount-of-results-returned-in-cloudkit) – Ryde

0

followig समारोह का अनुरोध किया रिकॉर्ड प्रकार के लिए सभी रिकॉर्ड वापस आ जाएगी:

let database = CKContainer(identifier: "container_here").privateCloudDatabase 
typealias RecordsErrorHandler = ([CKRecord], Swift.Error?) -> Void 

func fetchRecords(forType type: String, completion: RecordsErrorHandler? = nil) { 

    var records = [CKRecord]() 

    let query = CKQuery(recordType: type, predicate: NSPredicate(value: true)) 
    let queryOperation = CKQueryOperation(query: query) 
    queryOperation.zoneID = CloudAssistant.shared.zone.zoneID 

    queryOperation.recordFetchedBlock = { record in 
     records.append(record) 
    } 

    queryOperation.queryCompletionBlock = { cursor, error in 

     self.fetchRecords(with: cursor, error: error, records: records) { records in 
      completion?(records, nil) 
     } 
    } 

    database.add(queryOperation) 
} 

private func fetchRecords(with cursor: CKQueryCursor?, error: Swift.Error?, records: [CKRecord], completion: RecordsHandler?) { 

    var currentRecords = records 

    if let cursor = cursor, error == nil { 

     let queryOperation = CKQueryOperation(cursor: cursor) 

     queryOperation.recordFetchedBlock = { record in 
      currentRecords.append(record) 
     } 

     queryOperation.queryCompletionBlock = { cursor, error in 
      self.fetchRecords(with: cursor, error: error, records: currentRecords, completion: completion) 
     } 

     database.add(queryOperation) 

    } else { 
     completion?(records) 
    } 
} 
2

यहाँ स्विफ्ट 3.0 में जवाब है।

func myQuery() { 
    let predicate = NSPredicate(value: true) 
    let query = CKQuery(recordType: "tableName", predicate: predicate) 

    publicDatabase.perform(query, inZoneWith: nil) { (record, error) in 

     for record: CKRecord in record! { 
      //... 

      // if you want to access a certain 'field'. 
      let name = record.value(forKeyPath: "Name") as! String     
     } 
    } 
} 
0

के लिए समाधान स्विफ्ट 4, दिखाता है कि प्रकार "YourTable" के सभी रिकॉर्ड लाने के लिए, यह भी प्रिंट System Field और Custom Field:

let query = CKQuery(recordType: "YourTable", predicate: NSPredicate(value: true)) 
CKContainer.default().publicCloudDatabase.perform(query, inZoneWith: nil) { (records, error) in 
    records?.forEach({ (record) in 

    // System Field from property 
    let recordName_fromProperty = record.recordID.recordName 
    print("System Field, recordName: \(recordName_fromProperty)") 

    // Custom Field from key path (eg: deeplink) 
    let deeplink = record.value(forKey: "deeplink") 
    print("Custom Field, deeplink: \(deeplink ?? "")") 
    }) 
} 
संबंधित मुद्दे