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 中的一对一关系(无法确定一对一关系的子/依赖方)