【问题标题】:CoreData: Using transient properties with read-only persistent storeCoreData:将瞬态属性与只读持久存储一起使用
【发布时间】:2016-03-31 14:00:43
【问题描述】:

处理来自read-only 持久存储的托管对象 (NSManagedObject) 我试图使用瞬态属性来存储一些临时值。考虑到瞬态属性没有保存到持久存储中,我认为将它们用于缓存目的没有任何问题。但事实证明,即使在来自read-only 存储的托管对象的瞬态属性中,您也无法写入数据。在NSManagedContext 的保存操作期间,我收到了这个错误

“无法将对象更新为只读存储”

(我确定只更改了瞬态属性。)

这是为什么呢?能不能算是NSManagedObjectContext的bug?感谢您分享您的想法。

【问题讨论】:

    标签: ios core-data readonly transient nspersistentstore


    【解决方案1】:

    这是预期的行为。 只读存储无法修改。甚至在托管对象上下文中(在内存中)也没有。这就是“只读”的含义。几乎没有错误。

    解决方案相当简单。创建第二个内存持久存储并通过配置将其集成到您的托管对象模型中。通过此商店跟踪您的临时财产。也许您必须创建一个“包装器”实体并通过关系将其链接到只读存储。

    尽管创建了一个更复杂的模型设置,我认为这是一个可行的解决方案,因为一旦你完成了这个设置,你基本上可以忘记它。

    【讨论】:

    • 你说得有道理。我只是认为在这种情况下保存操作应该很轻松,因为它不是尝试将数据写入持久存储。
    【解决方案2】:

    您可以在实体类中声明自己的属性:

    @interface DBExample : NSManagedObject
    
    @property (nonatomic, strong) NSDictionary *userInfo;
    
    @end
    

    实施:

    @implementation DBExample
    
    @synthesize userInfo = _userInfo;
    
    @end
    

    顺便问一下,为什么要使用附加的只读持久存储来保存上下文?

    【讨论】:

    • 感谢您提供简单的解决方案。为我的目的使用这样的自定义属性甚至更好,因为我保持模型图没有临时属性。此外,我不需要任何临时属性基本上适用的撤消管理。至于你的问题。我的持久存储协调器包含两个具有相同数据结构的持久存储。其中之一(默认数据集)是只读的。
    • 我唯一要补充的是,如果您定义自定义实例变量或属性,例如“您应该在 didTurnIntoFault 中而不是在 dealloc 中清理这些变量”。 (来自 NSManagedObject 文档。)
    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 2017-01-10
    • 2016-11-17
    • 2011-01-17
    • 1970-01-01
    • 2017-06-13
    • 2014-03-29
    • 1970-01-01
    相关资源
    最近更新 更多