【问题标题】:Recursive CoreData attributes递归 CoreData 属性
【发布时间】:2011-03-22 14:50:54
【问题描述】:

我有一个关于潜在愚蠢的数据库设计的潜在愚蠢问题。

假设我有这个设计(在使用 CoreData 的 iOS 项目中):

A 类
- 名称:NSString
- 孩子:A 类对象的 NSSet
- 父级:A 类对象

所以这是一个简单的父/子设置。这一切都很好。

现在,我想这样做,如果 A 类对象没有为“名称”定义值,则搜索其父对象,直到找到定义了“名称”的对象并返回此值。

这是一件棘手的事情,因为我的自然反应是像这样覆盖 name 的 getter:

- (NSString *)name
{
  return name =! nil ? name : self.parent.name;
}

但这不起作用,因为“name”必须通过 self.name 访问,因为这是一个 CoreData 实体。

然后我有了创建一个名为 nameRecursive 的新方法的想法,其工作方式如下:

- (NSString *)nameRecursive
{
  return self.name =! nil ? self.name : self.parent.name;
}

但这感觉很笨重而且不是很优雅(因为 A 类的现实版本有许多需要像这样工作的属性),但我无法想出更好的方法。

是否有人对 a) 这是否是一个愚蠢的设计或 b) 我如何以优雅的方式解决它有任何想法。

任何想法或想法都会很棒。提前致谢。

【问题讨论】:

  • 您可能需要重新考虑您的设计,因为它会遮挡对象。如果您对name 进行提取,您将获得解析为该名称的所有对象。相反,如果您在图形中查找名称,您将返回第一个实际没有名称的对象命中。我不确定你在寻找什么逻辑,但你需要小心这些动态属性。
  • 感谢 TechZen。我怀着忐忑的心情处理这个问题,因为它打破了很多优秀数据库设计的想法,但它确实很适合我的工作。看看结果会很有趣!希望我不会后悔!

标签: iphone ios core-data


【解决方案1】:

看起来下面的问题可以帮助你实现你提到的第一个方法

How can I override a getter on a property when using Core Data?

所以不要这样做

return name =! nil ? name : self.parent.name;

你可以这样做......

return [self primitiveValueForKey:@"name"] =! nil ?
                     [self primitiveValueForKey:@"name"] : self.parent.name;

更新以回答 cmets 中的查询

Apple 建议您不要这样做。请参阅 Apple 文档中Managed Object Accessor Methods 的“自定义属性和一对一关系访问器方法”部分。这提供了有关如何正确执行此操作的更多详细信息(并鼓励您不要这样做。)也许如果您有许多以完全相同的方式工作的属性,您可以创建一个方法,例如

recursiveValueFor: (NSString*) property;

它可以作为递归逻辑的通用包装器,同时不干扰 CoreData 动态属性

【讨论】:

  • 太棒了,非常感谢。关于这是否是我应该做的事情的任何想法?
  • 再次感谢 Dolbz。您建议的处理许多属性的方法正是我打算做的。也感谢 Apple Docs 的链接。会阅读和学习!
猜你喜欢
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
  • 2021-01-01
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多