iPhone - 核心数据问题?

Posted

技术标签:

【中文标题】iPhone - 核心数据问题?【英文标题】:iPhone - Core Data Question? 【发布时间】:2010-10-16 20:52:48 【问题描述】:

我有 2 个实体:用户、地址。 我已经设置了每个用户可以有很多“地址”的关系。 我不确定核心数据是如何工作的,但据我了解,每次我调用 insertEntityForName 时,它​​都会创建并存储一个对象。 (也是表格中的一行)

所以问题: 下面的代码不是在核心数据中存储了重复的地址吗?

    当我为用户实体插入它时 还插入一个地址 当我调用插入地址时 它创建另一个地址的实体。

如果我是正确的,这实际上会在数据库中创建一个重复,有什么方法可以防止它?

User *user = [NSEntityDescription insertEntityForName:@"User" 
                      inManagedObjectContext:self.managedObjectContext];
user.firstName = @"first name";
user.lastName = @"last name";

Address *address = [NSEntityDescription insertEntityForName:@"Address" 
                      inManagedObjectContext:self.managedObjectContext];
address.street = @"street";
user.address = address;

【问题讨论】:

【参考方案1】:

不,这不会创建重复的地址。第一次插入时,它只创建User,而不是Address。用户的地址将为零。

如果你确实建立了用户一对多的Address 关系,你不能像那样分配user.address,它应该给出一个警告,因为它期待一个NSSet*。我也建议称它为addresses。你可以这样做:

user.address = [NSSet setWithObject:address];

[user addAddressObject:address];

【讨论】:

非常感谢,很好的答案。 1 个问题我需要创建“addAddressObject”方法吗?还是由 NSManagedObject 创建的?我得到“可能不响应”addAddressObject” 它是在您创建 NSManagedObject 子类时创建的,我假设您知道该怎么做,因为您使用的是名为“User”和“Address”的类。如果您在模型中对它们进行更改,您可能需要重新创建这些类。 另外,我的意思是在答案中提到这一点,但我会在这里补充一点,您并不想将 Core Data 视为具有表和行的数据库。有一些相似之处,Core Data 甚至可以使用数据库来存储数据,但我认为差异很大。【参考方案2】:

CoreData 不限于数据库,它也可以在内存中工作或使用 XML。以下是使用 sqlite 商店时发生的事情。

核心数据在用户表中插入一行,在地址表中插入一行。如果一个地址只能有一个用户,那么它将在地址表中添加一列(在设置数据库时),该列将包含用户条目的 id。这就是两者的联系方式。您如何创建链接也无关紧要 user.address = XY;或 XY.user = 用户;

然而 user.address = XY 仅在用户只能有一个地址时才有效。

【讨论】:

以上是关于iPhone - 核心数据问题?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone核心数据预设

核心数据和 iPhone 的 NSDecimalNumber 问题

iPhone:核心数据保存错误

iPhone - 获取核心数据的数据

核心数据最大存储 iPhone

iphone, 以多对多关系保存数据, 核心数据