2011-04-14 111 views

回答

1

嗯,我不知道我理解你的问题,但我会尝试在简单的领域模型的上下文中回答。

比方说,你有一个Person类和一个Computer类,都延伸NSManagedObjectPerson通过单向关系链接到Computer,名为computers的NSSet。

这将允许你在代码中说:

Person *person = // ... (loaded from database) 
NSSet *computers = person.computers; 
for (Computer *computer : computers) { 
    // do something fun 
} 

然而,因为它是一个单向的关系,你会能够做到这一点:

Computer *computer = // loaded from DB 
Person *person = computer.person; // This line won't work 

因此,因为它不起作用 - 没有向后关系 - 获取相关Person类的唯一方法是构建一个Fetch请求来查询数据库并查找将Computer作为成员的Person实例。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSPredicate *predicate = // define your NSPredicate to find the Person object here 
[fetchRequest setPredicate:predicate]; 
NSError *error = nil; 
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error]; 
[fetchRequest release]; 

一般来说,这是烦人。因此,如果可能的话,双向定义您的关系(例如反向)通常是一个好主意,这将使您能够做到:

Person *person = computer.person; 
+0

这样做很有意义。啧啧。 – 2011-04-14 07:14:55

+0

我仍然缺少一些东西。说我仍然想要有人来电脑单向关系。说出这样做的方式,而不会让猜测错误是将计算机定义为关系而不是定义关系。因此,没有人拥有电脑。我们没有人与电脑的关系。我们已经把人与计算机之间的关系搞定了。所以你的谓词不起作用。 – 2011-04-14 07:17:05

+0

提取关系是计算的 - 它们在物理上并不代表数据库中保存的数据。它们对于排序结果和/或仅返回一个子集等事物很有用 - 例如,您可以从Person - > Computer获取一个名为'appleComputers'的获取关系,该关系只返回这个人拥有的计算机和'where make =“Apple”'。 – asinesio 2011-04-14 17:31:58