2012-04-19 3 views
5

Ich versuche, NSManagedObjectIDs in Core Data-Objekten zu archivieren/entpacken, damit beim nächsten Start meiner App diese IDs abgerufen und zum Abrufen bestimmter Objekte verwendet werden können.Was ist der richtige Weg, um eine NSURL in Core Data zu speichern?

Ich habe versucht, „Archivierung“ die ID wie folgt aus:

//defaultConfiguration is an NSManagedObject defined elsewhere and it works just fine...  
// and newObject is also properly initialized, bound to a context,etc... 

ArchivedID* newID = [NSEntityDescription insertNewObjectForEntityForName:@"ArchivedID" inManagedObjectContext:managedObjectContext]; 
[self.defaultConfiguration addArchiveIDObject:newID]; 
newID.idURI = [[newObject objectID] URIRepresentation]; 
[managedObjectContext save:&error]; 

Und dann so dearchiviert (Ich werde nur für [ANYOBJECT] Ursache Ich teste und es gibt nur einen an dieser Stelle):

NSManagedObjectID* ID = [managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:[defaultConfiguration.archiveID anyObject]]; 

Aber wenn ich versuche, die URL immer wie oben zurück, erhalte ich die folgende Ausnahme:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ArchivedID relativeString]: unrecognized selector sent to instance 0x7f59f20' 

Das Attribut in der Entity wurde über Xcode auf "transformable" gesetzt und ich habe das Transformer-Wert-Feld in Xcode leer gelassen, da die Core Data-Dokumentation zu implizieren scheint, wenn sie leer ist, verwende sie den Standard-Transformer.

Was mache ich falsch?

+0

was hat das mit nsurl zu tun? – Chet

Antwort

0

Ok ... Es war 14hrs gerade der Codierung .. ich eine bin .. eh .. Idiot:

ich das Attribut in dem Objekt ArchivedID Zugriff vergessen zu. Das heißt:

NSManagedObjectID* ID = [managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:[defaultConfiguration.archiveID anyObject]]; 

sollte

NSManagedObjectID* ID = [managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:[[defaultConfiguration.archiveID anyObject] idURI]]; 
+0

Das funktioniert auch :) – kevboh

1

Es ist möglich, dass Sie dieses Problem lösen können, ohne URLs zu speichern. Ziehen Sie in Erwägung, Ihrem Modell ein boolesches Flag hinzuzufügen und die Objekte, die Sie abrufen möchten, als wahr zu markieren und markierte Objekte beim nächsten Start Ihrer App zu holen.

Sie könnten jedoch versuchen, die Zeichenfolgenversion der URL mit -absoluteString abzurufen und diese zu speichern.

+0

Wenn Sie diesen Ansatz gewählt haben, achten Sie darauf, das Feld "indexiert" für das boolesche Attribut zu aktivieren, da Sie basierend auf diesem Flag abgerufen werden. – ma11hew28

-1

Ich mag, was @kevboh vorgeschlagen. Sie könnten auch das Speichern der objectID s spezifischen s in NSUserDefaults in Betracht ziehen. Zum Beispiel:

[[NSUserDefaults standardUserDefaults] setObject:featuredNSManagedObjectIDArray 
              forKey:@"FeaturedNSManagedObjectIDs"]; 
+0

kevboh's Art funktioniert, aber fügt eine zusätzliche Ebene der Indirektion hinzu. Mir geht es gut, so wie ich es gemacht habe. Ich hatte nur einen Tippfehler. – SaldaVonSchwartz

0

Hmmm. Scheint, dass es einen viel einfacheren Weg gibt, dies mit CoreData zu tun. Denken Sie daran, CoreData ist ein Objektgraph. Es ist gut, Beziehungen zu verfolgen.

Warum haben Sie nicht einfach eine Entität in CoreData, die eine Eins-zu-viele-Beziehung zu den Objekten hält, die Sie mögen? Dann können Sie einfach einfügen/entfernen/suchen/wiederholen/was auch immer über die Sammlung von Objekten.

+0

Die archivierte URL-Methode erlaubt die Übertragung der IDs über JSON, etc .. und wenn ich ein zu viele zu den Objekten behalte, kann ich sie auch einfach holen (sie sind in einem zu vielen um damit zu beginnen). Der springende Punkt war, in der Lage zu sein, sie rechtzeitig zu finden, ohne ein Ganzes zu schaffen, Prädikat, was nicht, – SaldaVonSchwartz

Verwandte Themen