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 - 核心数据问题?的主要内容,如果未能解决你的问题,请参考以下文章