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

War es hilfreich?

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.

konvertieren

Sie 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:

  1. Erstellen Sie eine neue Attribut auf Ihrer Entität namens „id“
  2. Erstellen Sie ein neues Attribut auf Entitys geordnete Entität namens „myEntitysMaxId“
  3. Ignoriere Ihre Entitys Mutter Implementierung "addNewMyEntityObject:"
  4. Dort erhöhen „myEntitysMaxId“ und stellt diesen Wert als den neuen Entitys „id“
  5. Sie, wie Sie normalerweise tun, wenn Sie ein Unternehmen holen auf der Grundlage ihrer Attribute!

Viele sauberer und besser!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top