【发布时间】:2013-08-12 07:13:50
【问题描述】:
// Test listing all words with their sentence
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Word"
inManagedObjectContext:context];
[fetchRequest setEntity:entity];
[fetchRequest setFetchLimit:10];
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
for (Word *info in fetchedObjects) {
NSLog(@"Word object: %@", info.word);
Sentence *details = info.relatedToSentence;
NSLog(@"Sentence object: %@", details.sentence);
}
我有两个实体,分别称为 Word 和 Sentence。在每个实体中都有一个属性,分别称为单词和句子。这种关系是反向的,不是可选的,并且是一对一的。
我能够分别从两个实体中提取记录,但不知何故我无法通过一个实体获取相关对象,我做错了什么? 上面的代码有效,它仅打印单词对象的值和句子对象的(null)...我使用 sqlite 作为该数据库的源。在对模型进行建模后,我填写了由 Xcode 创建的 sqlite 文件。
【问题讨论】:
-
代码看起来没问题。如果
info.relatedToSentence打印为 (null),则 Word 对象与 Sentence 对象无关。你是如何填写 sqlite 文件的? -
@martin 是的,我应该如何建立关系?我通过在他们的表中的 zword 和 zsentence 中插入一个字符串值来填充它,即两个名为 ZWORD 和 ZSENTENCE 的单独表。
-
为什么不用Core Data来填充初始数据库呢?编写一个小型命令行工具来创建数据库并创建托管对象和关系。不建议直接修改sqlite文件,容易出错。 - (在您的情况下,ZSENTENCE 将有一个 ZRELATEDTOWORD 列,而 ZWORD 将有一个 ZRELATEDTOSENTENCE 列,并且都必须正确填写。)
-
@martin 因为它是一个巨大的数据库,所以我必须预先填充它。我现在正在测试 5 个值,但它仍然无法正常工作。真的吗?我在 sqlite 中看到 ZRELATEDTOWORD 和 ZRELATEDTOSENTENCE,是的,我应该用什么填充它们?
-
我的意思是你编写一个单独的工具,它只运行一次来创建数据库,然后将数据库作为资源复制到你的真实项目中。 - (ZRELATEDTOWORD 是相关单词的 Z_PK,ZRELATEDTOSENTENCE 是相关句子的 Z_PK。)
标签: core-data relationship nsfetchrequest one-to-one