Ios 关系中的实体如何知道加入什么

Ios 关系中的实体如何知道加入什么,ios,core-data,Ios,Core Data,这是一个从基于SQL的数据库过渡过来的人提出的基本问题,我通常会对这些数据库进行保密,但我真的很想理解。当两个实体在关系中连接时,核心数据如何确定要连接的属性?它是通过匹配属性名来解决问题的,还是通过它如何知道 我想知道为什么下面的代码不起作用 我有一个实体,书的属性如下: aid|authorname 我有另一个实体,具有属性的作者 bid|bookname|authorid //note authorid here is spelled differently than in the a

这是一个从基于SQL的数据库过渡过来的人提出的基本问题,我通常会对这些数据库进行保密,但我真的很想理解。当两个实体在关系中连接时,核心数据如何确定要连接的属性?它是通过匹配属性名来解决问题的,还是通过它如何知道

我想知道为什么下面的代码不起作用

我有一个实体,书的属性如下:

aid|authorname
我有另一个实体,具有属性的作者

bid|bookname|authorid

//note authorid here is spelled differently than in the author entity.
作者与名为book的书有很多关系 书籍与名为author的作者有一种关系

在VC的书中,在我的.h文件中

@property (nonatomic,weak) Books * book;
在.m文件中,我在ViewDidLoad中有以下代码

NSString *authorname = self.book.author.authorname;
//this is supposed to be book-object.author-relationship,authorname-attribute
//however it displays blank
NSLog(@"author name%@",authorname); //displays blank
我在应用程序的其他地方有非常相似的代码,可以很好地工作(尽管两种关系都是一对一的),所以我想我一定错过了一些愚蠢的地方

然而,这让我想知道,核心数据究竟是如何确定哪位作者与哪本书同行的

属性名称是否应该匹配

感谢您的见解。

CoreData“知道”两个对象是相关的,当且仅当您告诉它时,您可以通过(假设您已在数据模型编辑器中定义了关系)将一个对象指定给另一个对象的关系属性:

myBook.author = myAuthor;
或同等地

[myAuthor addBooksObject:myBook];
完成此操作后,CoreData将“知道”这两个对象是相关的(即使您保存了数据,然后重新加载)。这完全独立于您可能认为指示两个对象相关的属性(例如
aid
authorid

如果您希望
书籍
作者
相关,并且
辅助
与书籍的
作者
相等,则可以这样编程。因此,例如,如果您从服务器将
作者
aid=123
同步,然后将一些
书籍
authorid=123
同步,则需要将
作者
aid=123
同步,并设置与上述代码类似的关系。我怀疑是您错过的这一步,并导致了空白作者姓名。
如果在同步过程中执行此操作,则此后可以仅依赖关系,而无需担心主键、外键、联接等。在幕后,CoreData为每个实体维护一个唯一的主键,并为每个关系维护外键。如果直接检查底层SQLite数据库和/或激活SQLDebug,您可以看到这些信息。

您知道核心数据实体不需要id字段吗?另外,您不需要将id添加为属性->这些由关系处理。是的。我的ID用于与服务器交互,我意识到有自动生成的托管对象ID。但是,我仍然不明白核心数据是如何将一个实体中的对象ID与另一个实体中的对象ID进行匹配的;?同步书本时,我会在托管对象上下文中为每本书本保存一个my book。。然后我创建一个新的author实体并将作者保存在其中。这就是我要包括myBook.author=myAuthor@zztop最佳顺序取决于同步时服务器对数据的布局方式。如果可能的话,我会先创建
作者
,然后循环创建所有
书籍
并设置与刚创建的作者的关系。您可能必须首先尝试获取作者(使用谓词获取具有正确的
aid
)如果未找到作者,则创建一个新的作者。当您试图设置关系时,两个对象必须属于同一个托管对象上下文,这一点非常重要。因此,需要明确的是,一旦您指定Hardy.book=Derbervilles的Tess,核心数据会永远记住这一点吗?但是你必须循环阅读每一本书和每一位作者来连接这些联系?i、 e.Hardy.book=远离疯狂的人群,Hardy.book=回归故土,Dickens.book=大卫·科波菲尔等@zztop是的,没错-前提是你保存了建立关系的上下文。尽管由于
book
与许多人的关系,您可以选择
[dickens addBookObject:davidcoperfield]
davidcoperfield.author=dickens