在保存NSUserDefaults的CoreData实体
-
20-08-2019 - |
题
设想一个CoreData实体(例如命名searchEngine
)。结果
NSManagedObjectContext
管理一些本实体的“实例”。结果
最终用户将能够选择与"standard searchEngine"
他NSPopupButton
。结果
NSPopupButton的selected object
应绑定到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
解决方案
您不会想尝试和存档核心数据实体并将其存储。相反,你将存储的密钥或一些其他已知的属性,并用它在应用程序启动时获取的实体。
一些示例代码(略从张贴在的例子改性核心数据编程指南):
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...
}
此方式,您在用户默认保存名称并获取该实体需要时。
其他提示
如果您需要存储到一个特定的管理对象的引用,使用它的管理对象ID的URI表示:
NSURL *moIDURL = [[myManagedObject objectID] URIRepresentation];
可以然后将URL保存到用户的默认值。
要检索管理对象,可以使用:
NSManagedObjectID *moID = [myPersistentStoreCoordinator managedObjectIDForURIRepresentation:moIDURL];
NSManagedObject *myManagedObject = [myContext objectWithID:moID];
唯一需要注意的是,你必须保证原有管理对象ID是永久的 - 这不是一个问题,如果你已经保存的对象,或者您可以使用obtainPermanentIDsForObjects:error:
下面是该使用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];
}