Ios 如何在NSUserDefault中设置实体

Ios 如何在NSUserDefault中设置实体,ios,objective-c,core-data,nsuserdefaults,Ios,Objective C,Core Data,Nsuserdefaults,我们是否可以将核心日期实体存储到NSUser NSUserDefault中。因为我正在尝试保存该实体。但它在我要使用的位置返回null。但如果我尝试保存实体属性,它将返回阀门的值 下面是我使用以下命令保存实体时的代码示例 MyEntity *newEntity = [self.fetchController objectAtIndexPath:indexPath]; [[NSUserDefaults standardUserDefaults]setObject:newEntity

我们是否可以将核心日期实体存储到NSUser NSUserDefault中。因为我正在尝试保存该实体。但它在我要使用的位置返回null。但如果我尝试保存实体属性,它将返回阀门的值

下面是我使用以下命令保存实体时的代码示例

    MyEntity *newEntity = [self.fetchController objectAtIndexPath:indexPath];
    [[NSUserDefaults standardUserDefaults]setObject:newEntity forKey:@"Act"];
并使用以下命令获取实体。结果为null

     MyEntity *entityAtOtherClass =[[NSUserDefaults standardUserDefaults] valueForKey:@"Act"];
如果我试图存储实体属性,比如字符串,那么我就能够获得这个实体对象的值

[[NSUserDefaults standardUserDefaults]setValue:newEntity.name forKey:@"Activity"];
从(强调添加):

NSUserDefaults
类提供了方便的访问方法 常见类型,如浮点、双精度、整数、布尔和URL。A. 默认对象必须是属性列表,即(或)的实例 对于集合:
NSData
NSString
,的实例组合,
NSNumber
NSDate
NSArray
NSDictionary
如果要存储任何 对于其他类型的对象,通常应将其存档以创建
NSData的实例

换句话说:如果要存储的内容不是
NSData
NSString
NSNumber
NSDate
NSArray
NSDictionary
,则需要对其进行序列化和反序列化。如果您的对象支持
NSCoding
,则可以使用
NSKeyedArchiver
进行编码/解码。例如,还可以用字符串表示法序列化字典


另请参见。

的文档为了将自定义对象存储到NSUserDefaults中,您需要在对象中实现
encodeWithCoder
initWithCoder
方法()

这个问题有一个很好的答案:

如果要取回相同的对象,则不需要存储整个对象,只需存储其对象ID即可

存储起来很容易:

NSString *myObjectToStore = [[[myObject objectID] URIRepresentation] absoluteString];
[[NSDefaults standardUserDefaults] setObject:myObjectToStore forKey:@"myKey"];
取回对象有点困难,因为您需要对要使用的持久存储和上下文进行引用;我假设它们在
myPersistentStore
myContext
中:

NSURL *myObjectURL = [NSURL URLWithString:[[NSDefaults standardUserDefaults] objectForKey:@"myKey"]];
NSManagedObjectID *myObjectID = [myPersistentStore managedObjectIDForURIRepresentation:myObjectURL];

NSError *error = nil;
MYManagedObjectClass *myObject = [myContext existingObjectWithID:myObjectId error:&error];

您在问题中提到的“核心数据实体”似乎实际上是一个
NSManagedObject
子类,而不是
NSEntity
<代码>NSManagedObject实例不能存储在核心数据之外。西蒙的回答是一个很好的方法。只需确保您拥有对象的永久
NSManagedObjectID
,而不是临时对象。

是否同步到NSUseredDefault?我不建议像这样使用objectID。objectID可以而且确实会改变。生成您自己的唯一标识符,将其存储在核心数据中,并在
NSUserDefaults
中引用它,这要安全得多。否则,在您的第一次迁移中,该值可能会发生变化。@MarcusS.Zarra感谢您的指出。但您能告诉我“第一次迁移,该值可能会发生变化”的确切含义吗?对不起,差不多一年了,我问了这个问题,但如果您能告诉我一点,我将不胜感激。因为我还在学习
东西
here@MarcusS.Zarra我买了《实用程序员的核心数据》一书,期待着更多地探索核心数据:)
-objectID在当前应用程序生命周期中是独一无二的。然而,这并不保证是一致的。这意味着它可以在应用程序的生命周期之间更改。例如,如果执行迁移,则该值将更改。同样,如果使用iCloud,该值可能会更改。