我一直在試圖找到一個很好的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的例子是行走有多個表並且實際上具有一對多關係(以及鏈接是什麼)?
這是我的邏輯倒臺,謝謝。我必須記住該項目的名稱,然後在合併後再次搜索它。然後我設定了關係。 – MrD
我有另一個後續問題/錯誤。在修改類別表中的條目後,代碼未保存。這一切都適用於初始運行,但是在重新加載應用程序時,沒有任何關係存在。在編輯完某些東西之後,是否需要在MOC上調用保存? CoreData是否看不到它已被修改並重新更新? – MrD
你必須自己保存。而且你必須檢查錯誤,如果我沒有記錯的話,如果出現錯誤,保存失敗就會失敗。 iOS Coredata模板將它們的上下文保存在applicationWillTerminate:和applicationDidEnterBackground:中。但是,在完成一系列更改之後,保存這些信息是一種很好的做法。這樣,當應用程序崩潰時,您不會失去所有更改。 –