Core Data 一对一关系无法正常工作

Posted

技术标签:

【中文标题】Core Data 一对一关系无法正常工作【英文标题】:Core Data one-to-one relationship does not work properly 【发布时间】: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。) 【参考方案1】:

对于您的核心数据模型,SQLite 表如下所示:

CREATE TABLE ZSENTENCE ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZRELATEDTOWORD INTEGER, ZSENTENCE VARCHAR );
CREATE TABLE ZWORD ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZRELATEDTOSENTENCE INTEGER, ZWORD VARCHAR );

其中 ZRELATEDTOWORD 是相关单词的主键 (Z_PK),ZRELATEDTOSENTENCE 相关句子的主键。两者都必须正确填写。

但是: 请注意,不建议修改 Core Data SQLite 文件,并且 容易出错。该格式未正式记录,可能将来会发生变化。

我还是推荐写一个单独的命令行工具(可以使用同一个Core Data 模型作为你的主要项目),它使用核心数据方法来创建和填充 初始数据库。

【讨论】:

谢谢。一个单独的预填充工具应用是个好主意!

以上是关于Core Data 一对一关系无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

EF Core 中的一对一关系(无法确定一对一关系的子/依赖方)

Core Data 上的一对多关系

Core Data addObject 一对多关系

如何处理 CORE DATA 中的一对多关系

设置一对多关系 Core Data 和 Magical Record

Core Data 获取请求与 NSFetchedResultsController 的一对多关系