【问题标题】:Iphone Core Data: Date Default Value as Current dateIphone Core Data:日期默认值作为当前日期
【发布时间】:2011-04-15 17:57:20
【问题描述】:

我正在使用核心数据。我有一个具有日期类型属性的实体。有没有办法可以将默认值设置为当前日期? (比如在属性的默认值中输入“CURRENTDATE”或其他内容?)

谢谢

【问题讨论】:

    标签: iphone xcode core-data


    【解决方案1】:

    您可以在模型中使用“now”,但 Core Data 在编译时评估它,而不是运行时。您将获得存储在模型默认值中的编译日期,这可能不是您想要的:

    http://iphonedevelopment.blogspot.com/2009/07/core-data-default-dates-in-data-model.html

    确保当前日期的默认属性值最可靠的方法是覆盖 NSManagedObject 子类中的-awakeFromInsert 并在那里分配当前日期。

    - (void) awakeFromInsert 
    {
       [super awakeFromInsert];
       self.date = [NSDate date];
       // or [self setPrimitiveDate:[NSDate date]]; 
       // to avoid triggering KVO notifications
    
    }
    

    注意:如果您使用嵌套的托管对象上下文(或 UIManagedDocument),上述内容将无法按预期工作。此建议仅适用于使用单个托管对象上下文时。

    【讨论】:

    • 这是不对的,因为每次创建 NSManagedObject 时都会调用 awakeForInsert。不同的 NSManagedObject 可以在不同的线程中创建,它们代表同一个 CoreData 实体。
    • 在代表同一实体的两个不同线程中创建托管对象将违反 Core Data 物理定律。并且绝对是某些应用程序逻辑错误的指标。不建议这样做。
    • 我相信你可以。这是一个公平的用例:您肯定可以在主线程上有一个 Core Data 对象用于显示(比如说“照片”对象),然后在后台有一个工作线程从数据库加载相同的对象,应用一些图像处理,将照片保存回持久存储。此时您会收到一个全局更改通知,主线程可以决定将更改合并到主线程托管对象上下文中。
    • 我相信你被方法名称误导了。从文档:awakeFromInsert: Invoked automatically by the Core Data framework when the receiver is first inserted into a ***managed object context***.在网上搜索更多,我还发现这个链接在谈论这个问题,当 NSManagedObject 首次插入上下文而不是存储时调用 awakeFromInsert:mikeabdullah.net/an--awakefrominsert-gotcha.html
    • 我现在明白了。父子上下文的交互增加了awakeFromInsert 的使用。我站得更正。感谢阿卜杜拉的参考。如果我以前读过它,我会忘记它。
    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 2011-04-09
    • 2012-11-20
    • 2020-04-03
    • 1970-01-01
    • 2021-03-09
    相关资源
    最近更新 更多