Das mag dumm erscheinen, aber ich konnte immer noch nicht herausfinden, wie man ein Attribut als Primärschlüssel in der xcdatamodel-Datei markiert. Mein persistenter Speicher ist eine SQLite-Datei. Kann mir jemand helfen?
Wie kann ich in diesem Fall eine ID als eindeutig "validieren"? Soll ich eine Validierungsmethode schreiben oder so?
iphone
cocoa-touch
core-data
Mugunth
quelle
quelle
Beachten Sie, dass Core Data ein Objekt-Diagramm-Persistenz-Framework und keine Datenbank ist. Dinge wie Primärschlüssel werden weg abstrahiert, da sie von der Implementierung des persistenten Speichers abhängen.
quelle
Core Data erstellt einen eigenen Primärschlüssel - Sie müssen keinen hinzufügen. Sie können es mit abrufen
NSManagedObjectID *moID = [managedObject objectID];
quelle
Manchmal benötigt man beim Hacken das tatsächliche int des Primärschlüssels. Hier ist, wie man es greifen kann:
NSManagedObjectID *yourManagedObjectID = [yourManagedObject objectID]; int yourManagedObject_PK = [[[[[yourManagedObjectID URIRepresentation] absoluteString] lastPathComponent] substringFromIndex:1] intValue];
Obwohl CoreData ein Objektdiagramm ist, sollte diese Art des Abrufs des Primärschlüssels eines NSManagedObject kein Problem sein, wenn man sich die von CoreData generierten SQLite-Datenbankdaten ansieht. Ich habe CoreData und die sqlite3 C-Bibliothek auf niedriger Ebene zusammen im selben Code verwendet und die Übergabe von Primärschlüsseln von CoreData an sqlite3 zum Abrufen von Datensätzen funktioniert einwandfrei.
! Wenn Sie diesen Code in der Produktion verwenden möchten, beachten Sie mögliche interne Änderungen an der Art und Weise, wie der DB-Primärschlüssel in eine URIR-Darstellung umgewandelt wird. Dies kann Ihren Code beschädigen.
genießen
quelle
Ohne NSManagedObjectID zu hacken, können Sie eine schnelle Überprüfung Ihres Attributs durchführen, bevor Sie Ihre Remote-Datenerfassung verwalten.
Ich habe eine Dienstprogrammmethode erstellt. Überprüfen Sie sie hier
quelle
Eine Swift-Erweiterung zum Abrufen des Primärschlüssels
extension NSManagedObject { var primaryKey : String { guard objectID.uriRepresentation().lastPathComponent.count > 1 else { return "" } return objectID.uriRepresentation().lastPathComponent.substring(from: 1) } }
Und für String
extension String { func substring(from : Int) -> String { guard self.count > from else { return "" } return String(self[self.index(self.startIndex, offsetBy: from)...]) } }
quelle
Ich würde lieber Zeit + den Klassennamen als eindeutige Kennung verwenden.
quelle