Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 在NSUserDefaults中保存CoreData实体_Cocoa_Core Data_Save_Nsuserdefaults - Fatal编程技术网

Cocoa 在NSUserDefaults中保存CoreData实体

Cocoa 在NSUserDefaults中保存CoreData实体,cocoa,core-data,save,nsuserdefaults,Cocoa,Core Data,Save,Nsuserdefaults,想象一个CoreData实体,例如名为searchEngine的实体。 NSManagedObjectContext管理此实体的某些实例。 最终用户将能够使用NSPopupButton选择他的标准搜索引擎。 NSPoupButton的选定对象应绑定到NSUserDefaults。 问题是: 1@try{save} a如果尝试将所选实例直接保存到NSUserDefault,则会出现如下情况: -[NSUserDefaults setObject:forKey:]: Attempt to inser

想象一个CoreData实体,例如名为searchEngine的实体。 NSManagedObjectContext管理此实体的某些实例。 最终用户将能够使用NSPopupButton选择他的标准搜索引擎。 NSPoupButton的选定对象应绑定到NSUserDefaults。 问题是:

1@try{save}

a如果尝试将所选实例直接保存到NSUserDefault,则会出现如下情况:

-[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'. 那么,你知道如何在plist兼容的数据中获取这些实体吗

2@try{registerDefaults}

通常registerDefaults:方法在+voidinitialize中实现。这里的问题是,在CoreData从其数据库加载保存的实体之前调用此方法。所以我不能将默认设置为不存在的对象,对吗


我知道,长长的问题。。。但是:试试{[me-provide:details]};D

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

一些示例代码从中发布的示例稍作修改:


通过这种方式,您可以在用户默认值中保存名称,并在必要时获取实体。

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

NSURL *moIDURL = [[myManagedObject objectID] URIRepresentation];
然后可以将URL保存为用户默认值

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

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

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

以下是目前使用4.0中添加的setURL和getURL方法来执行此操作的最干净、最短的方法,以避免对NSKeyedUnrchiver和NSKeyedArrchiver的额外调用:

塞特:

吸气剂:


My model将记录的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.uuidString即可将UUID保存为字符串。

Mmh。你知道为什么阵列!=无,但[数组计数]<0。。。它不想工作…如果数组!=nil则没有错误,但也可能没有返回记录[array count]==0。。。但是,[array count]<0永远不会发生,因为count消息返回整数类型。编译器很可能会剥离任何此类测试[数组计数]<0.5。我的意思是[数组计数]==0。对不起。我只想表示这个数组中没有任何内容;我认为这是一个巧妙的解决方案。正如NSUserDefaults的文档所述,还有一个小的补充,即需要将NSURL对象归档为NSData。因此,请注意不要保存NSURL的现状。我只是犯了这个错误,当我试图取回这个对象时,一直得到零。还要注意,NSUserDefaults有一个setURL:forKey:method。不过,我认为目前iPhone操作系统还不具备这一功能。setURL:forKey:在iOS 4.0中可用,以后请注意!tilish的注释很重要,正确的解决方案如下:如果不这样做,您将收到错误消息:尝试插入非属性列表对象x-coredata:
NSManagedObjectID *moID = [myPersistentStoreCoordinator managedObjectIDForURIRepresentation:moIDURL];
NSManagedObject *myManagedObject = [myContext objectWithID:moID];
 + (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];
 }
public class Patient: NSManagedObject {    
    override public func awakeFromInsert() {
        super.awakeFromInsert()
        uuid = UUID()
}

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