Frage

Stellen Sie sich eine Coredata Einheit (zum Beispiel genannt searchEngine).
NSManagedObjectContext schafft einige „Instanzen“ dieser Entität.
Der Endbenutzer wird in der Lage sein seine "standard searchEngine" mit einem NSPopupButton auszuwählen.
Die selected object von NSPopupButton sollten die NSUserDefaults binded werden.
Das Problem:

  

1) @try {speichern}

     
    

a) Wenn Sie versuchen, die ausgewählte "Instanz" zu NSUserDefaults direkt zu speichern etwas wie dieses es kommt:

-[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value ' (entity: searchEngine; id: 0x156f60  ; data: {
    url = "http://google.de/";
    someAttribute = 1;
    name = "google";
})' of class 'searchEngine'.

         

b) Wenn Sie versuchen, die "Instanz" zu konvertieren NSData dies kommt:

-[searchEngine encodeWithCoder:]: unrecognized selector sent to instance 0x1a25b0

         

So eine Idee, wie diese Einheiten erhalten in einem plist-kompatibelen Daten?

  
     

2) @try {registerDefaults}

     
    

Normalerweise sind die registerDefaults: Methode wird in + (void)initialize umgesetzt. Das Problem hierbei ist, dass diese Methode aufgerufen wird, bevor Coredata die gespeicherten Objekte aus seiner Datenbank lädt. So kann ich nicht eine Standard auf ein nicht existierendes Objekt gesetzt, nicht wahr?

  

Ich weiß, lange Fragen ... aber: try {[me bieten: Details]}; D

War es hilfreich?

Lösung

Sie möchte nicht versuchen, und einen Kerndateneinheit zu archivieren und zu speichern. Stattdessen würden Sie den Schlüssel speichern oder ein anderes bekanntes Attribut und es verwenden, das Unternehmen zu holen, wenn die Anwendung gestartet wird.

Einige Beispiel-Code (etwas aus dem Beispiel in der Core Data Programming Guide ):

NSManagedObjectContext *moc = [self managedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription
    entityForName:@"SearchEngine" inManagedObjectContext:moc];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entityDescription];

NSPredicate *predicate = [NSPredicate predicateWithFormat:
    @"engineName LIKE[c] '%@'", selectedEngineName];
[request setPredicate:predicate];

NSError *error = nil;
NSArray *array = [moc executeFetchRequest:request error:&error];
if (array == nil)
{
    // Deal with error...
}

Auf diese Weise können Sie den Namen in den Benutzereinstellungen speichern und an das Unternehmen holen, wenn nötig.

Andere Tipps

Wenn Sie einen Verweis auf ein bestimmtes verwalteten Objekt speichern müssen, verwenden Sie die URI Darstellung seiner verwalteten Objekt-ID:

NSURL *moIDURL = [[myManagedObject objectID] URIRepresentation];

Sie können dann die URL auf die Benutzereinstellungen speichern.

das verwaltete Objekt abzurufen, die Sie verwenden:

NSManagedObjectID *moID = [myPersistentStoreCoordinator managedObjectIDForURIRepresentation:moIDURL];
NSManagedObject *myManagedObject = [myContext objectWithID:moID];

Die einzige Einschränkung ist, dass Sie, dass der ursprüngliche verwaltete Objekt-ID permanent gewährleisten müssen -. Dies kein Problem ist, wenn Sie bereits das Objekt gespeichert, alternativ können Sie obtainPermanentIDsForObjects:error: verwenden

Hier ist der sauberste und kürzester Weg zu derzeit tut dies in 4.0 hinzugefügt, um die setURL und getURL Methoden 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];
 }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top