【问题标题】:How to set entity in the NSUserDefault如何在 NSUserDefault 中设置实体
【发布时间】:2013-12-18 10:48:15
【问题描述】:

我们能否将核心日期实体存储到 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"];

【问题讨论】:

  • 你同步到nsuserdedefault了吗?

标签: ios objective-c core-data nsuserdefaults


【解决方案1】:

来自documentation(强调添加):

NSUserDefaults 类提供方便的访问方法 常见类型,例如浮点数、双精度数、整数、布尔值和 URL。一种 默认对象必须是一个属性列表,即(或 对于集合实例的组合):NSDataNSStringNSNumberNSDateNSArrayNSDictionary如果您想存储任何 其他类型的对象,您通常应该将其归档以创建一个 NSData 的实例。

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

另请参阅-[NSUserDefaults setObject:forKey: 的文档。

【讨论】:

    【解决方案2】:

    如果您想取回同一个对象,则不需要存储整个对象 - 只需存储其对象 ID。

    保存起来很容易:

    NSString *myObjectToStore = [[[myObject objectID] URIRepresentation] absoluteString];
    [[NSDefaults standardUserDefaults] setObject:myObjectToStore forKey:@"myKey"];
    

    取回对象有点困难,因为您需要引用要使用的持久存储和上下文;我假设他们在myPersistentStoremyContext

    NSURL *myObjectURL = [NSURL URLWithString:[[NSDefaults standardUserDefaults] objectForKey:@"myKey"]];
    NSManagedObjectID *myObjectID = [myPersistentStore managedObjectIDForURIRepresentation:myObjectURL];
    
    NSError *error = nil;
    MYManagedObjectClass *myObject = [myContext existingObjectWithID:myObjectId error:&error];
    

    【讨论】:

    • 我不建议像这样使用 objectID。 objectID 可以而且确实会改变。生成自己的唯一标识符,将其存储在 Core Data 中并在 NSUserDefaults 中引用它要安全得多。否则,在您第一次迁移时,该值可能会发生变化。
    • @MarcusS.Zarra 感谢您的指出。但是您能否告诉我您的意思是“第一次迁移,该值可能会改变”。抱歉,我问这个问题已经快一年了,但如果你能告诉我一些关于这个问题,我将不胜感激。因为我仍然在这里学习things
    • @MarcusS.Zarra 我买了《面向实用程序员的核心数据》一书,期待更多地探索核心数据:)
    • -objectID 在当前应用程序生命周期中是唯一的。但是不能保证是一致的。这意味着它可以更改应用程序的 生命周期。例如,如果您进行迁移,则该值将发生变化。同样,如果您使用 iCloud,则该值可能会发生变化。
    【解决方案3】:

    为了将自定义对象存储到 NSUserDefaults 中,您需要在对象中实现 encodeWithCoderinitWithCoder 方法 (NSCoding protocol)。

    这个问题有一个很好的答案: How to store custom objects in NSUserDefaults

    【讨论】:

      【解决方案4】:

      您在问题中所指的“核心数据实体”似乎实际上是 NSManagedObject 子类,而不是 NSEntityNSManagedObject 实例不能存储在 Core Data 之外。西蒙的回答是一个很好的方法。只要确保您拥有该对象的永久NSManagedObjectID,而不是临时的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-11
        • 1970-01-01
        • 2018-05-18
        • 2011-10-20
        • 2013-10-09
        相关资源
        最近更新 更多