2017-01-09 2 views
0

Ich baue eine einfache App in Swift mit Core Data und versuche zu entscheiden, ob ich eine eindeutige ID in meinen Entitäten speichern soll. In meiner Forschung habe ich Beispiele dafür gefunden und Beispiele, die das nicht tun, aber ich habe keine klare Begründung für diese Art von Entscheidung gefunden.Welche Fragen sollte ich mir stellen, um festzustellen, ob ich einen "Primärschlüssel" für meine Core Data App benötige?

Bitte beachten Sie: - ich aus einem RDBMS Hintergrund kommen und ich weiß, dass Core Data ein Objektdiagramm ist, keine relationale db - ich weiß, dass Core Data ein NSManagedObjectID schafft, aber wie ich, wenn dieser Wille bestimme werden genug

ich sehe Themen wie this (ab 7 Jahren, übrigens), die diese Optionen legt:

  • Sie mit - [NSManagedObject objectID]. Beachten Sie, dass diese ID nur vorübergehend, bis entweder das Objekt zum ersten Mal gespeichert wird, oder Sie rufen
  • [NSManagedObjectContext obtainPermanentIDsForObjects: Fehler:] Verwenden Sie die CFUUID Familie von Funktionen eine UUID für jedes Objekt in Ihrer -awakeFromInsert Methode zur Erzeugung
  • erstellen sie Ihre eigenen Primärschlüssel-ähnliches System, das eine ganze Zahl in Ihrem Modell speichert und erhöht es mit der Schaffung jedes Objekt

aber ich habe nicht in der Lage gewesen, viele Informationen zu finden, über die Optionen, für die angemessen sind Situationen.

Welche Fragen sollte ich mir stellen, um herauszufinden, ob der eindeutige Identifier von Core Data (NSManagedObjectID) alles ist, was ich brauche oder ob ich darüber hinausgehen und einen eigenen in den Mix aufnehmen soll.

+0

Ich bin kein Core Data Coder (nur mit ihm), aber ich habe immer gedacht, es gibt zwei mögliche "Quellen" für das Modell - mySQL oder eine XML-Datei. Da ich selbst in einer vergangenen Lebensphase eine MSSQL-Person war, würde ich meinen, dass jedes DB-Design, das Ihnen gefällt, für eine Antwort ausreichen würde. In der Tat gibt es Argumente, die ich gelesen habe, dass CD manchmal eine unnötige Schicht ist und die Verwendung eines direkten mySQL-Designs die Dinge rationalisiert. (Diese Argumente behaupten manchmal, dass die größte Stärke der CD die Persistenz ist.) – dfd

Antwort

0

Der einzige Grund, Ihre eigenen eindeutigen IDs mit Core Data zu verwenden, ist, wenn Sie die Daten jemals mit einem anderen Gerät oder Webdienst synchronisieren. NSManagedObjectID ist ausreichend für den lokalen Gebrauch, aber sie funktionieren nicht gut für die Synchronisierung. Wenn Sie beispielsweise Daten von Ihrem Back-End-Server erhalten, hat dieser wahrscheinlich eindeutige IDs, aber Sie können Core Data nicht zwingen, sie zu verwenden. Auch wenn Ihre Synchronisierung mit einem anderen iOS-Gerät erfolgt, können Sie Core Data auf dem zweiten Gerät nicht zwingen, dasselbe NSManagedObjectID wie auf dem ersten Gerät zu verwenden.

Für den lokalen Gebrauch ist NSManagedObjectID alles was Sie brauchen. Wenn Sie eine Referenz auf ein verwaltetes Objekt in Benutzerstandardeinstellungen speichern müssen, können Sie diese speichern. Später können Sie object(with:) oder existingObject(with:) verwenden, um das verwaltete Objekt schnell abzurufen.

+0

Auf die Gefahr hin, das Offensichtliche zu sagen, Tom, du sagst, wenn ich später die Fähigkeit hinzufügen würde, über iOS-Geräte mit iCloud zu synchronisieren, muss ich meine eigenen eindeutigen IDs verwalten. Richtig? – Jim

+0

Ja, weil Sie die 'NSManagedObjectID' auf der Serverseite nicht verwenden können. Sie benötigen eine andere ID, um dem Server mitzuteilen, was Sie aktualisieren, oder um eingehende Daten vom Server zu verstehen. –

0

if Core Data's unique identifier (NSManagedObjectID) is all I need

Benötigen Sie zu welchem ​​Zweck genau?

Core Data behält die Primärschlüssel des Objekts intern bei, so dass Sie diese im Grunde nicht selbst implementieren müssen. In CD interagieren Sie mit Objekten, die bereits einen Mechanismus zum Herstellen von Beziehungen haben. Sie müssen nur eine zuweisen NSManagedObject auf eine Eigenschaft eines anderen NSManagedObject und das wird eine O2O oder O2M Beziehung wie folgt darstellen:

anotherObject.parent = oneObject; 

Für viel Seite gibt es einen Satz für das sein. Werfen Sie einen Blick auf die documentation.

Das einzige Szenario, wenn Sie eine Art von Fremdschlüsseln benötigen, wenn Sie Ihre Daten mit einigen Web-Service synchronisieren.

Dies könnte Sie interessieren post, wenn Sie einen Verweis auf bestimmte bestimmte NSManagedObject in Benutzerstandards speichern müssen.

Und übrigens, gibt es [[NSUUID UUID] UUIDString].

+0

Ich dachte an ein paar Zwecke wie 1) Ich habe ein 'UISegmentedControl', das einige Standardeinstellungen steuert und die eindeutigen IDs von 0 und 1 sehr einfach macht um den ausgewählten Wert dieses Steuerelements zu setzen/ändern und den Indexwert in 'NSUserDefaults' zu speichern 2) vermeide es, Dinge in vielen Fällen mit' String' zu vergleichen (nicht zum Bestimmen von Beziehungen) und 3) es scheint einfacher zu sein , sagen wir, die Eigenschaft 'description' eines bestimmten einzigartigen Datensatzes, der nach der Veröffentlichung meiner App der 'Eins' in einem 'Ein-Viele' sein könnte. – Jim

+0

Und dann sehe ich auch wirklich schlaue Apple-Typen (https://vimeo.com/140037432), die in ihren Beispielen so etwas wie 'newTask.setValue (NSUUID() .UUIDstring, forKey:" id ") verwendet haben Ich denke, es muss einen guten Grund geben. – Jim

+0

'NSManagedObjectID' verweist auf ein bestimmtes Objekt in einem bestimmten Speicher. So können Sie es sicher verwenden, wenn Sie keine Daten mit einer externen Anwendung austauschen müssen. Weitere Informationen finden Sie im Abschnitt [Übersicht] (https://developer.apple.com/reference/coredata/nsmanagedobjectid?language=objc#overview) der Dokumentation. – bteapot

Verwandte Themen