我有一个关于潜在的愚蠢数据库设计的潜在愚蠢问题。
说我有这个设计(在使用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)如何以优雅的方式解决它有任何想法。
任何想法或想法都会很棒。提前谢谢。
答案 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动态属性