1

我正在开发一个使用CoreData. 为了我的应用程序的目的,我想保存managedObjectId一个对象(在 plist 文件中),以便在下一次应用程序启动时检索该对象。

经过一些研究,我尝试了:

myDictionary setObject:self.myPerson.objectID.URIRepresentation.absoluteString forKey:@"lastSelectedPerson"];
// Then I write the dictonary into a file
// I get a value like "x-coredata://8CF33004-BADD-402D-9AA5-115A030F901A/Person/p1"

myPerson 是一个已保存在managedObjectContext.

接下来,我尝试检索 objectID,但使用此代码得到一个 nil 值:

// After retrieving the dictonary from the plist file
NSString * lastSelectedPersonId = [myDictionary objectForKey:@"lastSelectedPerson"];
NSManagedObjectID * objectID = [self.managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:[NSURL URLWithString:lastSelectedPersonId]];
self.myPerson = (Person *)[self.managedObjectContext existingObjectWithID:objectID error:&error];

你有什么建议吗?谢谢。

4

2 回答 2

1

要在下次启动时恢复对象,您也可以尝试以下操作:

  1. 将 objectID 保存到 NSUserDefaults:

    [[NSUserDefaults standardUserDefaults] setObject:self.myPerson.objectID forKey:@"lastSelectedPerson"]; 
    [[NSUserDefaults standardUserDefaults] synchronize];
    
  2. 在下一次启动时从 NSUserDefaults 获取值:

    NSNumber *lastSelectedPersonID = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastSelectedPerson"];
    
  3. 查询核心数据存储以获取对象:

    - (Person *)personWithID:(NSNumber *)personID {
    
    Person *person = nil;
    
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    request.entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:self.managedObjectContext];
    request.predicate = [NSPredicate predicateWithFormat:@"objectID == %@", personID];
    
    NSError *error = nil;
    NSArray *persons = [self.managedObjectContext executeFetchRequest:request error:&error];
    
    person = [persons lastObject];
    
    return person;
    }
    
于 2013-07-01T16:20:40.217 回答
0

我有一个类似的问题,我正在创建一个托管对象并提取对象 ID,但它尚未保存到磁盘。如果是这种情况,则对象 ID 是“临时” ID。我会检查使用:[NSManagedObjectID isTemporaryID]

如果它返回它是一个临时 id,您需要保存该对象并确保您有一个永久 id。

文档:http: //developer.apple.com/library/mac/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectID_Class/Reference/NSManagedObjectID.html#//apple_ref/occ/instm/NSManagedObjectID/isTemporaryID

于 2013-07-01T16:28:04.890 回答