我正在开发一个使用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];
你有什么建议吗? 感谢。
答案 0 :(得分:1)
要在下次启动时恢复对象,您也可以尝试以下操作:
将objectID保存到NSUserDefaults:
[[NSUserDefaults standardUserDefaults] setObject:self.myPerson.objectID forKey:@"lastSelectedPerson"];
[[NSUserDefaults standardUserDefaults] synchronize];
在NSUserDefaults的下一次启动获取值:
NSNumber *lastSelectedPersonID = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastSelectedPerson"];
查询核心数据存储以获取对象:
- (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;
}
答案 1 :(得分:0)
我有一个类似的问题,我正在创建一个托管对象并取消对象ID,但它还没有保存到磁盘。如果是这种情况,则对象id是“临时”id。我会检查使用:[NSManagedObjectID isTemporaryID]
如果它返回它是一个临时id,你需要保存对象并确保你有一个永久id。