Cocoa 在NSUserDefaults中保存CoreData实体
想象一个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从其数据库加载保存的实体之前调用此方法。所以我不能将默认设置为不存在的对象,对吗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
我知道,长长的问题。。。但是:试试{[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 ...
}