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

时间:2012-06-25 19:23:54

标签: iphone cocoa-touch core-data sync

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

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

为此,我尝试将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 个答案:

答案 0 :(得分:1)

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

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