2016-08-09 56 views
0

Ich fand heraus, dass Core Data im Grunde eine SQLite-Datenbank ist. Jede Entität ist eine separate Tabelle. Es gibt auch Tabellen, die keine Entitäten sind, einschließlich Z_METADATA, Z_MODELCACHE und Z_PRIMARYKEY. Ich weiß nicht, was sie tun.Wie kann ich den Wert des Primärschlüssels eines NSManagedObject erhalten?

Wie auch immer, ich sah, dass die Felder der "Entity Tables" in etwa die gleichen wie die Eigenschaften, die ich im Datenmodell hinzugefügt habe, plus ein paar Extras. Zum Beispiel, wenn meine Entität nur eine Eigenschaft namens date hat. Die Tabelle wird ein Feld ZDATE sowie Z_PK, Z_ENT und Z_OPT haben.

Also scheinbar hat jede Entität einen Primärschlüssel, der im Z_PK Feld gespeichert ist! Ich möchte den Wert dieses Primärschlüssels eines bestimmten erhalten. Und ich möchte die Datenbank nach einem NSManagedObject fragen, das einen spezifischen Primärschlüssel hat.

Also im Grunde so etwas wie diese:

let pk = myManagedObject.primaryKey 
// the below should return myManagedObject 
managedObjContext.objectWithPrimaryKey(someEntityDescription, pk) 

Ich suchte die Dokumentation für NSManagedObject und sah ein objectID. Aber ich glaube nicht, dass das so ist, oder?

+1

Ich glaube, Sie beziehen sich auf Objekt-ID, wenn Sie Primärschlüssel sagen .. check out http://stackoverflow.com/questions/901640/core-data-primary-key –

Antwort

1

Core Data unterstützt dies nicht, da die API von Core Data sich stark von SQL unterscheidet. Wenn Sie in Bezug auf SQL denken, werden Sie Core Data viel schwieriger machen, als es sein muss.

let objectID = myManagedObject.objectID 

// Later 
let myManagedObject = context.object(with: objectID) 
// Or... 
let myManagedObject = context.existingObject(with: objectID) 

Mit object(with:) schneller ist, aber möglicherweise weniger sicher:

Die ungefähren Core Data äquivalent Ihre Code-Snippet wäre so etwas wie (unter Verwendung von Swift 3-Syntax) sein. Die Verwendung von existingObject(with:) kann etwas langsamer sein, ist aber sicherer.