设想一个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];
 }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top