2011-03-22 70 views
3

我有一个可能愚蠢的问题关于一个潜在的愚蠢的数据库设计。递归CoreData属性

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

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

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

现在,我想这样做,以便如果A类对象没有为'name'定义值,则会搜索其父项,直到找到确定'name'的值并返回此值。

这是做一件棘手的事情,因为我的自然反应来覆盖名,吸气这样的:

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

但是,这并不工作,因为“名”通过自助进行访问。因为这是一个CoreData实体。

我那时做了一个名为nameRecursive新方法,其工作方式的想法:

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

但这种感觉很笨重,不是很优雅(为A类的现实生活版有哪些需要很多属性像这样工作),但我一直没有想到更好的东西。

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

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

+1

您可能想重新考虑您的设计,因为它会遮蔽对象。如果你在'name'上进行提取,你将得到所有解析为那个名字的对象。相反,如果您走图寻找名字,您将返回实际上没有名字的第一个对象。我不确定你在找什么逻辑,但你需要注意这些动态属性。 – TechZen 2011-03-22 17:47:08

+0

感谢TechZen。我以惊人的态度接近这一点,因为它打破了很多关于良好数据库设计的想法,但它确实感觉像是适合我的工作。将看到它是如何变得有趣!希望我不后悔! – Mason 2011-03-23 05:02:03

回答

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动态属性

+0

太棒了,非常感谢。一般来说,对于这是否应该做的事情有任何想法? – Mason 2011-03-22 15:04:43

+0

在上面更新中回答,因为有更多的空间 – Dolbz 2011-03-22 15:25:45

+0

再次感谢Dolbz。你建议的处理很多物业的方式正是我打算做的。也感谢链接到Apple Docs。将阅读和学习! – Mason 2011-03-22 15:32:27