19

想象一个CoreData 实体(例如命名的searchEngine)。
NSManagedObjectContext管理该实体的一些“实例”。
最终用户将能够"standard searchEngine"使用NSPopupButton.
NSPopupButtonselected object应该绑定到 NSUserDefaults。
问题:

1)@try{保存}

a)如果您尝试将选定的“实例”直接保存到 NSUserDefaults ,则会出现如下内容:

-[NSUserDefaults setObject:forKey:]: 尝试插入非属性值 ' (entity: searchEngine; id: 0x156f60 ; data: {
    网址=“ http://google.de/ ”;
    一些属性 = 1;
    名称=“谷歌”;
})' 的类 'searchEngine'。

b)如果您尝试将“实例”转换为 NSData,则会出现以下情况:

-[searchEngine encodeWithCoder:]:无法识别的选择器发送到实例 0x1a25b0

那么知道如何在与 plist 兼容的数据中获取这些实体吗?

2)@try{registerDefaults}

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

我知道,很长的问题......但是:try{[me provide:details]} ;D

4

4 回答 4

35

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

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

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

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

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

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

于 2009-07-07T16:07:24.967 回答
8

这是目前使用 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];
 }
于 2013-12-28T20:40:48.650 回答
6

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

一些示例代码(根据Core Data Programming Guide中发布的示例稍作修改):

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

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

于 2009-02-01T01:32:20.207 回答
0

我的模型将记录的 UUID 保存到 UserDefaults,以便在下次应用启动时启动最后打开的记录。

public class Patient: NSManagedObject {    
    override public func awakeFromInsert() {
        super.awakeFromInsert()
        uuid = UUID()
}

extension Patient {
    @NSManaged public var uuid: UUID
    @NSManaged ...
}

使用唯一 ID (UUID) 标识每条记录是一种很好的做法。您可以将 UUID 保存为字符串,只需调用uuid.uuidString.

于 2020-06-30T11:26:32.053 回答