2010-10-16 153 views
0

我有2個實體:用戶,地址。 我已經設置了關係,每個用戶可以有許多「地址」。 我不知道核心數據如何工作,但從我的理解,每次我調用insertEntityForName它創建並存儲一個對象。 (也是表中的一行)iPhone - 核心數據問題?

所以問題: 以下代碼是否不在覈心數據中存儲重複地址?

  1. 當我插入用於用戶實體它 還插入一個地址
  2. 當我調用insert爲地址 實體它創建另一個地址。

如果我是正確的,這實際上在數據庫中創建一個副本是什麼方法來防止它?

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; 

回答

3

不,這不會創建重複的地址。在第一次插入時,它只創建User,而不是Address。用戶的地址將爲零。

如果你真的做到讓用戶一個一對多的關係Address,你不能分配user.address這樣,它應該因爲它的預期的NSSet*給予警告。另外我會建議將它稱爲addresses。你可以這樣做:

user.address = [NSSet setWithObject:address]; 

[user addAddressObject:address]; 
+0

非常感謝,很好的回答。 1我需要創建「addAddressObject」方法嗎?或者它是由NSManagedObject創建的?我得到「可能不會迴應」addAddressObject「 – aryaxt 2010-10-17 00:21:48

+0

它創建時創建NSManagedObject子類,我假設你知道如何做,因爲你使用的類稱爲」用戶「和」地址「。你可能會想要重新創建這些類如果你在模型中對它們進行了更改 – 2010-10-17 00:26:54

+0

另外,我的意思是在答案中提到這一點,但我會在此補充一點,你並不是真的想把核心數據看作是具有表格和行的數據庫。有一些相似之處,Core Data甚至可以使用數據庫來存儲數據,但我認爲差異很大。 – 2010-10-17 00:30:25

0

CoreData不限於數據庫,它也可以在內存中,或使用XML工作。以下是在使用sqlite存儲時發生的情況。

核心數據在用戶表中插入一行,在地址表中插入一個。如果一個地址只能有一個用戶,那麼它將在地址表中添加一個列(當設置數據庫時),該地址表將包含用戶條目的ID。這就是這兩者之間的聯繫。這也無關緊要你如何創建鏈接user.address = XY;或XY.user = user;

但user.address = XY只適用於用戶只能有一個地址。