当前位置:  开发笔记 > 编程语言 > 正文

在NSUserDefaults中保存CoreData实体

如何解决《在NSUserDefaults中保存CoreData实体》经验,为你挑选了3个好方法。

想象一下CoreData实体(例如命名searchEngine).
NSManagedObjectContext管理该实体的一些"实例".
最终用户将能够选择他"standard searchEngine"NSPopupButton.
selected objectNSPopupButton应绑定到的NSUserDefaults的.
问题:

1) @try {}保存

a) 如果您尝试将选定的"实例"直接保存到NSUserDefaults,则会出现以下情况:

-[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) 如果您尝试将"实例"转换为NSData,请执行以下操作:

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

那么任何想法如何在plist兼容的数据中获得这些实体?

2) @try {} registerDefaults

通常该registerDefaults:方法是在+ (void)initialize.这里的问题是在CoreData从其数据库加载保存的实体之前调用此方法.所以我不能将默认设置为不存在的对象,对吧?

我知道,很长的问题......但是:试试{[我提供:详情]}; D.



1> mmalc..:

如果需要存储对特定托管对象的引用,请使用其托管对象ID的URI表示:

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

然后,您可以将URL保存为用户默认值.

要检索托管对象,请使用:

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

唯一需要注意的是,您必须确保原始托管对象ID是永久性的 - 如果您已经保存了对象,则这不是问题,您也可以使用obtainPermanentIDsForObjects:error:.


setURL:forKey:在iOS 4.0及更高版本中可用
我认为这是一个很好的解决方案.如NSUserDefaults的文档所述,您需要将NSURL对象归档为NSData.所以不要拯救NSURL.我只是犯了这个错误,并在我试图检索对象时不断变为零.另请注意,NSUserDefaults具有setURL:forKey:方法.我认为此刻不适用于iPhone OS.

2> Matt Foley..:

这是目前使用4.0中添加的setURL和getURL方法执行此操作的最简洁和最短的方法,以避免额外调用NSKeyedUnarchiver和NSKeyedArchiver:

二传手:

 + (void)storeSomeObjectId:(NSManagedObjectID *)objectId
 {
     [[NSUserDefaults standardUserDefaults] setURL:[objectId URIRepresentation] 
                                            forKey:@"someObjectIdKey"];
     [[NSUserDefaults standardUserDefaults] synchronize];
 }

消气:

 + (SomeManagedObject *)getObjectByStoredId
 {
     NSURL *uri = [[NSUserDefaults standardUserDefaults] URLForKey:@"someObjectIdKey"];
     NSManagedObjectID *objectId = [self.persistentStoreCoordinator managedObjectIDForURIRepresentation:uri];
     SomeManagedObject *object = [self.managedObjectContext objectWithID:objectId];
 }



3> Jason Coco..:

您不希望尝试归档核心数据实体并将其存储.相反,您将存储密钥或其他一些已知属性,并在应用程序启动时使用它来获取实体.

一些示例代码(稍微修改自" 核心数据编程指南"中发布的示例):

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...
}

这样,您可以将名称保存在用户默认值中,并在必要时获取实体.

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有