2016-04-26 1 views
0

У меня есть два простых типа записи: Artwork и Artist. Artwork в качестве ребенка может принадлежать одинArtist, однако один Artist может иметь многократные произведения искусства.Как добавить запись в список ссылок для типа записи с помощью CloudKit?

Ниже приведены скриншоты, связанные с указанными типами записей.

enter image description here enter image description here

Я могу просто настроить artist для artwork следующим образом:

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?

Apple, говорит:

... представлять отношения один-ко-многим из Artist к Collection в объектной модели, добавьте поле ссылки на Collection записи.

Но как это сделать?

ответ

0

Ключ к вашим проблемам можно найти в документации компании Apple, которая говорит ...

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 
} 
Смежные вопросы