cocoa - tutorial - medium core data




NSManagedObjectID dans NSData (4)

J'ai trouvé ce merveilleux NSManagedObjectID. Ce serait très bien pour référencer un Entity / NSManagedObject / NSEntityDescription, n'est-ce pas?
Obtenons un identifiant d'une entité:

NSEntityDescription *entity = [self newEntity];     
NSManagedObjectID *objID = [entity objectID];

Alors ... une idée de comment obtenir cet objID dans une chaîne? Ou mieux: NSData. En fait, quelque chose pour pouvoir l'enregistrer dans NSUserDefaults. ;-)

Btw: NSFetchRequest ne veut pas fonctionner dans mon cas. J'utilise une version modifiée de cet exemple: réponse d'une vieille question .


Avez-vous regardé URIRepresentation ? Il est facile de convertir un NSURL à un NSString, et cela à un NSData.


De la documentation NSManagedObjectID:

Les ID d'objet peuvent être transformés en une représentation URI qui peut être archivée et recréée ultérieurement pour renvoyer à un objet donné (en utilisant managedObjectIDForURIRepresentation: (NSPersistentStoreCoordinator) et objectWithID: (NSManagedObjectContext) .Par exemple, le dernier groupe sélectionné dans une application peut être stocké dans l'utilisateur par défaut via l'ID de l'objet du groupe Vous pouvez également utiliser des représentations d'URI d'ID d'objet pour stocker des relations "faibles" entre des magasins persistants (où aucune jointure n'est possible).

Transformez-le en URL, puis transformez-le en chaîne ou en données.


Vous n'avez pas besoin de convertir le NSURL en NSString avant l'archivage. Juste archiver le NSURL.

Edit: J'ai récemment appris que l'identifiant d'un objet peut changer, par exemple après une migration. Il semble donc que ce n'est pas une bonne idée de sauvegarder un ID sur le disque en espérant pouvoir référencer l'objet plus tard.


Comme @preston l'a dit, n'enregistrez pas un objectID sur le disque, à la place:

  1. Faites un nouvel attribut sur votre entité appelée "id"
  2. Créez un nouvel attribut sur l'entité parent de votre entité appelée "myEntitysMaxId"
  3. Remplacer l'implémentation parent de votre entité "addNewMyEntityObject:"
  4. Là, augmentez "myEntitysMaxId" et définissez cette valeur comme les nouvelles entités "id"
  5. Faites comme vous le faites normalement lorsque vous récupérez une entité en fonction de ses attributs!

Beaucoup plus propre et meilleur!







save