2011-03-01 62 views
0

我一直在試圖找到一個很好的CoreData教程,它着重於具有一對多和多對多關係的更高級數據庫。從我讀過的內容可以看出,CoreData隱藏了通常處於多對多關係的中間表。但我的問題更多的是如何使用CoreData設置一對多關係。iOS/iPhone核心數據關係

我的數據庫的一部分包含一個類別表和一個項目表。一個類別可以有很多項目。

在我的程序中,我達到了用戶選擇一個類別的位置,然後列表視圖彈出,顯示應該在該類別中的所有項目。

我可以添加一個項目到表格中,當我嘗試在出現問題/崩潰時嘗試將項目添加到具有與類別關係的表格中時。

該項目應該完全保存到數據庫中,然後重新設置它並設置關係?

某些代碼:

[item.m]

@interface ITEM : NSManagedObject 
{ 
} 

@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) CATEGORY * category; 

@end 

[/item.m]

[category.m]

@interface CATEGORY : NSManagedObject 
{ 
} 

@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSSet* items; 

@end 


@interface CATEGORY (CoreDataGeneratedAccessors) 
- (void)addItemObject:(item *)value; 
- (void)removeItemObject:(item *)value; 
- (void)addItems:(NSSet *)value; 
- (void)removeItems:(NSSet *)value; 

@end 

[/category.m ]

沒有CoreDataGenerate dAccessors由我實現,我假設它們已經被創建和隱藏。

我嘗試設置關係,一旦從CATEGORY和一次從項目 即 [[self category] ​​addItemObject:[self item]]; 以及 [[self item] setCategory:[self category]];

但是都沒有成功...我得到這樣的錯誤:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Illegal attempt to establish a relationship 'category' between objects in different contexts (source = <NSManagedObject: 0x614b660> (entity: item; id: 0x61558f0 <x-coredata:///item/tF691713B-18B1-4D28-93CC-40327353C08F3> ; data: { 
    category = nil; 
    name = TestName; 

}) , destination = <CATEGORY: 0x4d55c20> (entity: category; id: 0x4d55050 <x-coredata://188D1CD9-6CC0-47EF-9C2A-A5DDDB1FAA24/category/p1> ; data: { 
    items = "<relationship fault: 0x4da4800 'items'>"; 
    name = "Test Category"; 
}))' 

所以我想這個問題應該是:我要去哪裏錯了,是有一個很好的教程,通過CoreData的例子是行走有多個表並且實際上具有一對多關係(以及鏈接是什麼)?

回答

3

「非法嘗試建立關係‘在不同的上下文

還有就是你的問題對象之間的類’。你不能在不同的上下文之間建立關係。

您可以重構代碼,以便在將類別分配給它之前,只將其中一個NSManagedObjectContext或merge項目放入「主要上下文」中。

+0

這是我的邏輯倒臺,謝謝。我必須記住該項目的名稱,然後在合併後再次搜索它。然後我設定了關係。 – MrD

+0

我有另一個後續問題/錯誤。在修改類別表中的條目後,代碼未保存。這一切都適用於初始運行,但是在重新加載應用程序時,沒有任何關係存在。在編輯完某些東西之後,是否需要在MOC上調用保存? CoreData是否看不到它已被修改並重新更新? – MrD

+0

你必須自己保存。而且你必須檢查錯誤,如果我沒有記錯的話,如果出現錯誤,保存失敗就會失敗。 iOS Coredata模板將它們的上下文保存在applicationWillTerminate:和applicationDidEnterBackground:中。但是,在完成一系列更改之後,保​​存這些信息是一種很好的做法。這樣,當應用程序崩潰時,您不會失去所有更改。 –