NSManagedObjectID in NSData
Frage
Ich fand dieses wunderbare NSManagedObjectID. Das wäre sehr gut für die Referenzierung einer Entity / NSManagedObject / NSEntityDescription, nicht wahr?
Lassen Sie sich eine ID von einer Einheit erhalten:
NSEntityDescription *entity = [self newEntity];
NSManagedObjectID *objID = [entity objectID];
So ... eine Idee, wie diesen objID
in einen String zu bekommen? Oder besser: NSData. Eigentlich speichern ihm etwas zu der Lage sein, den NSUserDefaults. ;-)
Btw: NSFetchRequest will nicht in meinem Fall arbeiten. Ich verwende eine modifizierte Version dieses Beispiels. Antwort einer alten Frage
Lösung
Um einen archivierten URI erhalten zu einem NSManagedObject
des objectID
entsprechen:
NSManagedObject* myMO;
...
NSURL *uri = [[myMO objectID] URIRepresentation];
NSData *uriData = [NSKeyedArchiver archivedDataWithRootObject:uri];
Um auf eine Instanz des ursprünglichen verwalteten Objekts zurück zu bekommen, benötigen Sie einen Coredata-Stack mit dem persistenten Speicher hält diese Instanz bereits hinzugefügt zum NSPersistentStoreCoordinator
. Dann gilt:
NSData *uriData;
NSPersistentStoreCoordinator *psc;
NSManagedObjectContext *moc; //with moc.persistentStoreCoordinator = psc.
...
NSURL *uri = [NSKeyedUnarchiver unarchiveObjectWithData:uriData];
NSManagedObjectID *moID = [psc managedObjectIDForURIRepresentation:uri];
NSManagedObject *myMO = [moc objectWithID:moID];
Andere Tipps
Aus der NSManagedObjectID Dokumentation :
Objekt-IDs können in eine umgewandelt werden URI Darstellung, die sein kann, archiviert und später neu zu beziehen zurück zu einem gegebenen Objekt (unter Verwendung von managedObjectIDForURIRepresentation: (NSPersistentStoreCoordinator) und objectWithID: (NSManagedObjectContext). Zum Beispiel, die zuletzt ausgewählte Gruppe in einem Anwendung könnte in die gespeichert werden Benutzervorgaben durch die Gruppe Objekt-Kennummer. Sie können auch Objekt verwenden ID URI Darstellungen speichern „schwach“ Beziehungen über persistent speichert (Wo kein Fest verbinden ist möglich).
Nur macht es zu einem URL dann wiederum, dass in einen String oder ein Datum.
Haben Sie sehen unter URIRepresentation ? Es ist einfach eine NSURL zu einem NSString, und das zu einem NSData.
konvertierenSie brauchen nicht auf die NSURL in eine NSString vor der Archivierung zu konvertieren. Nur archivieren die NSURL.
Edit: Ich habe vor kurzem erfahren, dass ein Objekt-ID kann, wie zum Beispiel nach einer Migration ändern. Es scheint daher nicht wie eine gute Idee, eine ID auf der Festplatte zu speichern, erwartete das Objekt später verweisen zu können.
Hier ist die sauberste und kürzeste Weg, fand ich dies derzeit tun, in 4.0 die setURL und getURL Methoden hinzugefügt Verwendung zu vermeiden, zusätzliche Anrufe NSKeyedUnarchiver und NSKeyedArchiver:
Setter:
+ (void)storeSomeObjectId:(NSManagedObjectID *)objectId
{
[[NSUserDefaults standardUserDefaults] setURL:[objectId URIRepresentation]
forKey:@"someObjectIdKey"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
Getter:
+ (SomeManagedObject *)getObjectByStoredId
{
NSURL *uri = [[NSUserDefaults standardUserDefaults] URLForKey:@"someObjectIdKey"];
NSManagedObjectID *objectId = [self.persistentStoreCoordinator managedObjectIDForURIRepresentation:uri];
SomeManagedObject *object = [self.managedObjectContext objectWithID:objectId];
}
Wie @preston sagte, keine objectID auf der Festplatte speichern, statt:
- Erstellen Sie eine neue Attribut auf Ihrer Entität namens „id“
- Erstellen Sie ein neues Attribut auf Entitys geordnete Entität namens „myEntitysMaxId“
- Ignoriere Ihre Entitys Mutter Implementierung "addNewMyEntityObject:"
- Dort erhöhen „myEntitysMaxId“ und stellt diesen Wert als den neuen Entitys „id“
- Sie, wie Sie normalerweise tun, wenn Sie ein Unternehmen holen auf der Grundlage ihrer Attribute!
Viele sauberer und besser!