递归CoreData属性

时间:2011-03-22 14:50:55

标签: iphone ios core-data

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

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

A类
- 名称:NSString
- 儿童:A类对象的NSSet
- parent:Class A对象

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

现在,我想这样做,如果一个A类对象没有为'name'定义一个值,就会搜索它的父节点,直到找到一个定义'name'的对象并返回该值。

这是一个棘手的事情,因为我的自然反应是覆盖这样的名字的吸气剂:

- (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)如何以优雅的方式解决它有任何想法。

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

1 个答案:

答案 0 :(得分:3)

看起来以下问题可能会帮助您实施您提及的第一种方法

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;

更新以回复评论中的查询

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

recursiveValueFor: (NSString*) property;

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