2016-04-26 130 views
0

我有兩個簡單的記錄類型:ArtworkArtistArtwork作爲一個孩子可能屬於一個Artist,然而一個Artist可能有多個藝術品。如何使用CloudKit將記錄添加到記錄類型的參考列表?

下面是與提及的記錄類型相關的屏幕截圖。

enter image description here enter image description here

我可以簡單地設置爲artistartwork下列方式:

let artistID = CKRecordID(recordName: "F297D690-888B-4B55-9FBD-27CAEF4BBD83") 
let artworkID = CKRecordID(recordName: self.idTextField.text!) 

self.container.publicCloudDatabase.fetchRecordWithID(artworkID, completionHandler: { artwork, error in 

    if let artwork = artwork { 

     artwork["artist"] = CKReference(recordID: artistID, action: CKReferenceAction.None) 
     self.container.publicCloudDatabase.saveRecord(artwork, completionHandler: { artwork, error in 

      print("done") 
     }) 
    } 
}) 

但問題是:

如何設置在相反的關係的關係?換句話說,如何將artworkID添加到參考列表artistID

蘋果說:

...來表示對象模型從Artist的一個一對多關係Collection,參考字段添加到Collection記錄。

但如何做到這一點?

回答

0

你的問題的關鍵,可以在蘋果的文檔,上面寫着中找到...

https://developer.apple.com/library/ios/documentation/CloudKit/Reference/CKReference_class/

它允許創建一組記錄圓形所屬的引用。

要保存含有它們之間的引用多條記錄,使用相同的CKModifyRecordsOperation對象在一個操作中第一或保存目標記錄保存的所有記錄。

在CloudKit中設置引用的代碼我確定你看過嗎?

let uniqReference = NSUUID().UUIDString 
    let unqUUID = CKRecordID(recordName: uniqUUID) 
    let newRecord = CKRecord(recordType: "Blah", recordID: uniqUUID) 

它說你需要在CKModifyOperation的同一時間保存所有記錄。

func saveLeCollection(theGlob:NSURL) { 

    let container = CKContainer(identifier: "Blah.com") 
    let publicDB = container.publicCloudDatabase 

    let uniqUUID = CKRecordID(recordName: uniqReference) 
    let newRecord = CKRecord(recordType: "Blah", recordID: uniqUUID) 
    let whistleAsset = CKAsset(fileURL: theImage) 
    newRecord["theImage"] = whistleAsset 

    newRecord.setObject(uniqUUID, forKey: "theLink") 

    var localChanges:[CKRecord] = [] 
    localChanges.append(newRecord) 

    let saveRecordsOperation = CKModifyRecordsOperation(recordsToSave: localChanges, recordIDsToDelete: records2Erase) 
    saveRecordsOperation.savePolicy = .ChangedKeys 
    saveRecordsOperation.perRecordCompletionBlock = { record, error in 
     if error != nil { 
      dispatch_async(dispatch_get_main_queue()) { 
       self.showAlert(message: error!.localizedDescription) 
       print(error!.localizedDescription) 
      } 
     } 
     // deal with conflicts 
     // set completionHandler of wrapper operation if it's the case 
    } 
    saveRecordsOperation.modifyRecordsCompletionBlock = { savedRecords, deletedRecordIDs, error in 
     if error != nil { 
      dispatch_async(dispatch_get_main_queue()) { 
       self.showAlert(message: error!.localizedDescription) 
       print(error!.localizedDescription) 
      } 
     } else { 
      // deal with conflictsay 
      // set completionHandler of wrapper operation if it's the case 

      } 
     } 
    } 

    saveRecordsOperation.qualityOfService = .Background 
    publicDB.addOperation(saveRecordsOperation) 
} 

如果我保存在我的作品記錄了ArtistID,在每一個藝術作品記錄了相同的ID我有一個多對一>一個參考。在我的參考書目中,我有一個「我的藝術家」記錄指向每個藝術作品記錄。

+0

你能申請這個例子從問題我的代碼?我認爲你的回答不清楚,並且假設不屬於這個主題(不確定)。問題不在於如何保存更改(*一個接一個或全部*),而是如何建立**一對多關係? –

1

這是最簡單的答案,我發現:

let artworkID = CKRecordID(recordName: self.idTextField.text!) 
if let artist = artist, var artworks = artist["artworks"] as? [CKReference] { 

    let reference = CKReference(recordID: artworkID, action: CKReferenceAction.None) 
    if !artworks.contains(reference) { 
     artworks.append(reference) 
    } 
    artist["artworks"] = artworks 

    //here you can save your changes or do whatever it needs 
} 
相關問題