iOS 核心数据抽象类和子类
Posted
技术标签:
【中文标题】iOS 核心数据抽象类和子类【英文标题】:iOS Core Data Abstract and Child Classes 【发布时间】:2012-10-20 12:49:24 【问题描述】:我正在努力将 CoreData 添加到现有的 ios 项目中,并且在从抽象类继承的子类中显示数据时遇到问题。
我有一个抽象类 (Object
),它为我想要的子实体/具体类定义了一组共享字段。例如,抽象类包含title
、startDate
。它在数据模型中设置为具有Object
的父实体。 Object
在数据模型中设置为抽象类。
我的子实体 (Expense
) 有一个属性 amount
(等等)。
我通常会这样开始创建我的费用:
Expense *expense = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Expense class]) inManagedObjectContext:[Store sharedStore].managedObjectContext];
然后设置我想要的属性:
expense.amount = [NSDecimalNumber decimalNumberWithString:amountString];
expense.title = title;
expense.startDate = [NSDate dateFromString:dateString withFormat:@"yyyy-MM-dd"];
(other properties on expense set here)
.
.
然后我会在我的上下文中调用 save:
[[Store sharedStore].managedObjectContext save:&error];
这将返回 YES
以存储到 CoreData。
但是,当我尝试记录费用的金额(或任何其他设置的属性)时,它们会根据属性类型显示为 nil、0 等。
我的项目中有其他基本实体/模型以这种方式保存得很好,所以这与我的 CoreData 设置或处理对象上下文的 Store 类无关。抽象类出现了具体问题。
如何设置我的抽象类的子实体,以便正确保存该子类的属性?我正在转动我的***,似乎无法在 Apple 文档或在线任何地方找到一个很好的例子来说明如何做到这一点。任何事情都值得赞赏。 :)
【问题讨论】:
您是否检查过expense
不是nil
? expense.amount = nil
是在您分配值之后立即还是在您保存上下文之后?
在最简单的情况下,这可以正常工作。我尝试通过设置一个带有孩子的抽象父母、创建一个孩子、分配任意值和保存来进行测试。保存后立即记录对象显示:“(实体:费用;id:0x7496dc0 Object
的值保存在 Expense 对象上。但是,它不会保存 Expense 实体本身的属性(金额是其中之一)。 @PhillipMills 你知道我的问题可能出现在哪里吗?我的日志看起来像你的,除了数量 = 0。:(你能想到的还有什么我可以分享的吗?
这是费用日志...... payee
和amount
存在于Expense 上,objectDescription
和startDate
存在于Object
上。amount
的实际定义是什么? (我只是在代码中使用了 int32 和 expense.amount = @(5);
以使其在那里保存一些价值。)另外,在您的情况下,Expense
中还有哪些其他字段?
【参考方案1】:
经过大量调试,并直接联系@PhillipMills,我们能够解决问题,我希望其他人不必花时间拉扯头发。 :)
在 Object
类上使用 - (void)setAmount
和 - (void)setPayee
方法会导致所需的设置器被覆盖。我并不是有意实现这些,但在我将 CoreData 引入我的项目之前,它们就存在于我的 Object
类中。
删除 Object 类上的那些 getter 和 setter 使事情按预期工作。非常感谢 Phillip 的帮助!
【讨论】:
以上是关于iOS 核心数据抽象类和子类的主要内容,如果未能解决你的问题,请参考以下文章