iOS 核心数据抽象类和子类

Posted

技术标签:

【中文标题】iOS 核心数据抽象类和子类【英文标题】:iOS Core Data Abstract and Child Classes 【发布时间】:2012-10-20 12:49:24 【问题描述】:

我正在努力将 CoreData 添加到现有的 ios 项目中,并且在从抽象类继承的子类中显示数据时遇到问题。

我有一个抽象类 (Object),它为我想要的子实体/具体类定义了一组共享字段。例如,抽象类包含titlestartDate。它在数据模型中设置为具有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 不是nilexpense.amount = nil 是在您分配值之后立即还是在您保存上下文之后? 在最简单的情况下,这可以正常工作。我尝试通过设置一个带有孩子的抽象父母、创建一个孩子、分配任意值和保存来进行测试。保存后立即记录对象显示:“(实体:费用;id:0x7496dc0 ;数据:数量=5;开始日期=” 2012-10-20 13:35:42 +0000"; 标题 = "测试标题"; )"。您发布的代码中不包含其他内容。 expense 不是 nil,它适当地将 Object 的值保存在 Expense 对象上。但是,它不会保存 Expense 实体本身的属性(金额是其中之一)。 @PhillipMills 你知道我的问题可能出现在哪里吗?我的日志看起来像你的,除了数量 = 0。:(你能想到的还有什么我可以分享的吗? 这是费用日志...... (entity: Expense; id: 0x9a3e780 ; data: amount = 0; objectDescription = "从 [Credit Card] 支付给 \"Objects of America\""; payee = ""; startDate = "2012-10-12 05:00:00 +0000" ; title = nil; ) ......其中payeeamount 存在于Expense 上,objectDescriptionstartDate 存在于Object 上。 Core Data 中amount 的实际定义是什么? (我只是在代码中使用了 int32 和 expense.amount = @(5); 以使其在那里保存一些价值。)另外,在您的情况下,Expense 中还有哪些其他字段? 【参考方案1】:

经过大量调试,并直接联系@PhillipMills,我们能够解决问题,我希望其他人不必花时间拉扯头发。 :)

Object 类上使用 - (void)setAmount- (void)setPayee 方法会导致所需的设置器被覆盖。我并不是有意实现这些,但在我将 CoreData 引入我的项目之前,它们就存在于我的 Object 类中。

删除 Object 类上的那些 getter 和 setter 使事情按预期工作。非常感谢 Phillip 的帮助!

【讨论】:

以上是关于iOS 核心数据抽象类和子类的主要内容,如果未能解决你的问题,请参考以下文章

抽象类和接口

抽象类和接口

Java 抽象类和接口有什么差别

大数据必学Java基础(四十三):抽象类和抽象方法讲解

抽象类和抽象方法

抽象类和接口的异同?