2009-09-16 26 views
7

Tôi đang cố gắng nhập một tập hợp dữ liệu vào lưu trữ liên tục CoreData. Đây là dữ liệu chỉ đọc sẽ được hiển thị cho người dùng trong thời gian chạy.Vấn đề quan hệ một-nhiều và nghịch đảo của CoreData

Tôi có một thực thể được gọi là "Danh mục" có quan hệ một-nhiều với một thực thể được gọi là "Mục", lần lượt có mối quan hệ nghịch đảo với Danh mục.

Khi tôi thêm mục vào ngữ cảnh, làm cách nào để liên kết chúng với Danh mục chính xác? Tôi có thể thấy trong dB SQLite rằng nó được thực hiện bằng cách thêm một trường thể loại vào bảng mục và có thể sử dụng khóa chính danh mục cho mối quan hệ. Nhưng PK là hậu trường ... có phương pháp tạo kết nối không?

Tôi cũng nhìn thấy trong lớp Category tôi rằng có những phương pháp tạo ra bởi CoreData để thêm mục, nhưng tôi giả định rằng đây là những ALOS phương pháp behind-the-scene cho phép CoreData để duy trì các mối quan hệ:

@interface Category (CoreDataGeneratedAccessors) 

- (void)addItemObject:(Item *)value; 
- (void)removeItemObject:(Item *)value; 
- (void)addItems:(NSSet *)value; 
- (void)removeItems:(NSSet *)value; 

@end 

Tôi đọc trong hướng dẫn lập trình mà CoreData tự động quan tâm đến phía bên kia của mối quan hệ, nhưng tôi không thể tìm ra cách thực hiện liên kết ban đầu đến một Danh mục như tôi thêm Mục.

Cảm ơn

jk

Trả lời

9

Có khả năng khác nhau. Nếu bạn đã có một đối tượng loại (ví dụ thu được thông qua một lấy theo yêu cầu), và giả định các biến

Category *category; 
Item *item; 

sau đó bạn chỉ cần làm như sau:

item.category = category; 

hoặc

[category setValue: category forKey:@"category"]; 

và bạn đã hoàn tất, vì Core Data tự động thiết lập các mối quan hệ nghịch đảo.

Nếu bạn không có một đối tượng loại, hoặc bạn muốn chèn một hình mới, làm như sau:

// Create a new instance of the entity 
Category *category = (Category *) [NSEntityDescription insertNewObjectForEntityForName:@"Category" inManagedObjectContext:managedObjectContext]; 
// add all of the category properties, then set the relationship 
// for instance set the category name 
[category setValue:@"myCategoryName" forKey:@"name"]; 
[category setValue:item forKey:@"item"]; 

Sau đó bạn đặt loại đối tượng này cho đối tượng mục của bạn chính xác như trước đây. Cuối cùng, những phương pháp bạn đã chỉ ra không được sử dụng đằng sau hậu trường bởi Core dữ liệu: các phương pháp này có sẵn cho bạn, do đó bạn cũng có thể làm như sau:

[category addItemObject:item]; 

hoặc nghịch đảo:

[item addCategoryObject:category]; 
+0

Cảm ơn, Unforgiven. Tôi đã tìm ra hầu hết điều này từ một bài đăng khác trên một bảng khác, nhưng câu trả lời của bạn rõ ràng là một cái chuông. Chúc tài liệu Táo tốt hơn! Bây giờ tôi cần phải tìm hiểu làm thế nào để lấy mục cho một thể loại nhất định và tôi là nhà miễn phí! jk – Alpinista

+1

Bạn cần liên kết NSPredicate với yêu cầu tìm nạp bạn sử dụng để tìm nạp đối tượng từ thực thể Mục. Nếu thực thể Danh mục của bạn lưu trữ tên của danh mục dưới dạng thuộc tính, bạn sử dụng mối quan hệ một-từ từ Mục đến Danh mục: NSPredicate * predicate = [NSPredicate predicateWithFormat: @ "category.name LIKE% @", yourCategoryNameStringHere]; Chỉ cần liên kết vị từ này với yêu cầu tìm nạp bạn sử dụng để tìm nạp đối tượng từ thực thể Mục. –

+1

Cảm ơn một lần nữa, Unforgiven. Tôi phát hiện ra rằng bạn cũng có thể đi theo một hướng khác: nếu bạn có Danh mục, bạn có thể nhận được một mảng Các mục từ NSSet của thuộc tính Items của Categorie. – Alpinista

Các vấn đề liên quan