2016-04-26 9 views
0

Ich habe zwei einfache Record-Typen: Artwork und Artist. Artwork als ein Kind kann einsArtist gehören, jedoch kann ein Artist Kunstwerke mehrfach haben.Wie füge ich Datensatz zur Referenzliste für Datensatztyp mit CloudKit hinzu?

Im Folgenden finden Sie die Screenshots zu den genannten Datensatztypen.

enter image description here enter image description here

Ich kann einfach Setup artist für artwork die folgende Art und Weise:

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") 
     }) 
    } 
}) 

Aber die Frage ist:

Wie Beziehungen zur Einrichtung in umgekehrter Beziehung? Mit anderen Worten, wie fügt man artworkID zu der Referenzliste von artistID hinzu?

Apple sagt:

... die Beziehung einer Eins-zu-viele-vertreten Artist-Collection im Objektmodell, ein Referenzfeld auf die Collection Datensatz hinzufügen.

Aber wie geht das?

Antwort

0

Der Schlüssel für Ihre Probleme finden Sie in der Apple-Dokumentation zu finden, der sagt ...

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

Es ist zulässig, dass ein Satz von Datensätzen Kreisbesitzende Referenzen zu erstellen.

Um mehrere Datensätze enthält Verweise zwischen ihnen, speichern die Zieldatensätze ersten oder Speichern aller Aufzeichnungen in einem Arbeitsgang unter Verwendung desselben CKModifyRecordsOperation Objekt zu speichern.

Der Code zum Einrichten einer Referenz in CloudKit Ich sicher, Sie gesehen?

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

Es sagt, Sie müssen mit einem CKModifyOperation alle Datensätze @ gleichzeitig speichern.

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) 
} 

Wenn ich die ArtistID in meiner Grafik Datensatz speichern, die gleiche ID in jedem Kunstwerk Rekord habe ich eine viel> eine Referenz. Und mit meiner Referenzliste habe ich eine-> viele Referenzen mit meiner Künstleraufzeichnung, die auf jeden Artwork-Datensatz zeigt.

+0

Könnten Sie dieses Beispiel zu meinen Code von Frage anwenden? Ich denke deine Antwort ist nicht klar, und angenommen, es ist außerhalb dieses Themas (nicht sicher). Die Frage ist nicht, wie man Änderungen speichert (* einzeln oder alle zu einem bestimmten Zeitpunkt *), sondern wie man ** eine zu viele ** Beziehung aufbaut? –

1

Dies ist die einfachste Antwort, die ich gefunden habe:

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 
} 
Verwandte Themen