以编程方式将属性添加到 Core Data

Posted

技术标签:

【中文标题】以编程方式将属性添加到 Core Data【英文标题】:Programmatically add attributes to Core Data 【发布时间】:2012-06-25 19:23:54 【问题描述】:

我正在开发一个使用核心数据的应用程序。在我的应用程序中,我希望每个用户都拥有相同的数据库。所以我希望所有设备共享相同的核心数据对象。

为了实现“同步”,我在this answer 上找到了一个讨论这个问题的演示文稿。在演示中,建议我为 Core Data 中的每个对象添加“creationDate”和“modificationDate”等属性。

为此,我尝试将 NSManagedObject (MyManagedObject) 子类化,以便将这些属性添加到核心数据中的每个对象。我还创建了我拥有的每个 NSManagedObject 子类(由模型自动生成)子类 MyManagedObject。

问题是我添加到 NSManagedObject 子类的属性没有持久化在数据库中。因此,当我关闭并重新打开应用程序时,'creationDate' 变为 (null)。

这是我的一些代码(标题):

@interface MyManagedObject : NSManagedObject
@property (nonatomic, retain) NSDate * modificationDate;
@property (nonatomic, retain) NSDate * creationDate;
@end

这是 .m 文件:

@implementation MyManagedObject
@synthesize modificationDate, creationDate;
-(void)willSave 
    [super willSave];    
    self.modificationDate = [NSDate date];

-(void)awakeFromInsert 
    [super awakeFromInsert];
    [self setCreationDate:[NSDate date]];
    [self setModificationDate:[NSDate date]];

任何帮助、指导或阅读将不胜感激。我已经为此苦苦挣扎了一段时间。我需要一种比将这些属性添加到模型中的每个实体更好的方法。提前致谢

PS:我打算在服务器中拥有一个“真相数据库”(一个 .sqlite 文件)。同步将在服务器和 iPhone 之间进行。如演示文稿中建议的那样

【问题讨论】:

【参考方案1】:

如果您在数据模型设计工具中创建 MyManagedObject 并将其注册为该工具内其他实体的父级,这应该几乎可以工作。 (我怀疑你没有这样做是因为 @synthesize 声明......那些通常是 @dynamic。)

要解决的另一个问题是,您必须在再次更改对象之前测试您是否已经更改了对象的属性(在您的情况下为self.modificationDate),否则willSave 将继续被调用。在第一次更改后设置并在 didSave 中清除的 BOOL 值很容易测试。

【讨论】:

这正是我所需要的!非常感谢!

以上是关于以编程方式将属性添加到 Core Data的主要内容,如果未能解决你的问题,请参考以下文章

以图形方式将对象添加到 Core Data

以编程方式获取 Core Data 实体描述

有人想以编程方式创建 Core Data 模型有啥理由吗?

以编程方式将系列添加到 OxyPlot 图表:没有显示

以编程方式添加 PageControl

以编程方式将块插入页面,由于其ID