2011-10-27 8 views
5

Tôi đang xây dựng một NSFetchRequest dữ liệu lõi trong mục tiêu c. Trong mô hình dữ liệu có một thực thể cha mẹ trừu tượng (có chứa 4 thuộc tính cơ bản) và nhiều thực thể con khác nhau bao gồm các thuộc tính không có trong cha mẹ. Một số trẻ chứa các thuộc tính chia sẻ cùng tên và kiểu dữ liệu.Một dữ liệu cốt lõi dành để kiểm tra xem các thực thể con có chứa một thuộc tính hay "keypath"?

Tôi đang áp dụng fetchRequest cho thực thể cha, để nó sẽ tìm kiếm tất cả các cá thể của các thực thể con để xem có tồn tại "keypath" hay không.

Tôi có thể tạo một vị từ chỉ trả về các thực thể con có chứa thuộc tính cụ thể không?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ IN self.entityAttributes",attribute.name]; 

Ở đây, thuộc tính là một thể hiện của NSAttributeDescription, và mục tiêu là để tìm kiếm các đơn vị khác mà có một thuộc tính của một tên phù hợp trong danh sách của họ về các thuộc tính, nhưng tôi không chắc chắn làm thế nào để định dạng vị ngữ.

Tôi có thể làm rõ thêm nếu cần. Cảm ơn!

Trả lời

5

Có lý do nào khiến bạn kiểm tra các trường hợp thay vì mô hình không? Bạn có thể dễ dàng tìm ra loại thực thể nào có một thuộc tính nhất định

for (NSEntityDescription* entityDescription in [self managedObjectModel]) { 
    if ([[entityDescription propertiesByName] objectForKey:@"someProperty"] != nil) { 
    // objects of this entity support the property you're looking for 
    } 
} 
+0

Tôi cần truy vấn các trường hợp vì mục tiêu cuối cùng là lấy các giá trị khác biệt của thuộc tính từ tất cả các cá thể đã xác định nó. Tôi đang sử dụng một vòng lặp tương tự như bạn đã liệt kê ở đây để tạo bảng chỉ mục theo cách thủ công cho giải pháp mà Wienke đề xuất. –

+0

Thực ra, tôi nghĩ bạn nên đi theo gợi ý của edsko. Khi điều kiện 'if' trong mã của anh ta là đúng, bạn đã có mô tả thực thể sẽ lấy tất cả các cá thể có thuộc tính mà bạn muốn.Bạn chỉ cần chạy tìm nạp trên mô tả thực thể đó, không có vị từ và bạn đang ở đó. Vẻ đẹp của nó là nếu bạn chỉ cần các cá thể với các giá trị cụ thể cho thuộc tính đó, bạn có thể thêm một vị từ cho chúng để tìm nạp. (Cảm ơn cả hai: Tôi đã không biết bạn có thể nhận được rất nhiều thông tin trực tiếp từ mẹ.) – Wienke

+0

Nếu đó là hiệu suất bạn đang sau, sau đó có lẽ bạn nên suy nghĩ lại mô hình cơ sở dữ liệu của bạn một chút. Core Data sẽ lưu trữ các thực thể khác nhau trong các bảng cơ sở dữ liệu khác nhau, vì vậy ngay cả khi bạn đưa ra một truy vấn phức tạp hoạt động trên các thực thể, nó có thể sẽ không hoạt động tốt. Có lẽ bạn nên thêm thuộc tính này vào thực thể cha mẹ thay vì chỉ để nó không được sử dụng trong các subentities không cần nó. – edsko

1

Câu hỏi thú vị, xứng đáng với một số thử nghiệm (trong trường hợp không có sự trợ giúp tốt hơn).

tôi đã cố gắng ngữ này trên một đối tượng quản lý:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.attributesByName.allKeys CONTAINS %@", @“nameOfAttrSought”]; 

Nhưng tôi đã nhận lỗi này: “thế hệ SQL chưa thực hiện cho vị ngữ”

Những gợi ý với tôi rằng SQL là không chuẩn bị để thâm nhập vào NSArrays, đó là những gì bạn nhận được bằng cách truy vấn NSEntityDescription cho các tên thuộc tính của nó.

Nếu không ai có thể đưa ra một vị đó sẽ làm những gì bạn muốn thông qua một yêu cầu lấy trực tiếp, tôi sẽ đề nghị cách giải quyết này:

Xác định một thực thể Namer mà có một chuỗi đơn attr named và một to- nhiều mối quan hệ members. Tạo một trong số này cho mỗi người có thể có mà các thực thể con mục tiêu của bạn có thể có. Sau đó, hãy cho trẻ có mối quan hệ rất nhiều với Namer được gọi là namers (nghịch đảo của mối quan hệ members). Khi chèn, thêm "tên" thích hợp vào mối quan hệ này. Sau đó, bạn có thể tạo một vị từ tìm nạp như sau:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@“ANY namers == %@“, namerSought]; 
// ("namerSought" is an instance of Namer.) 
+0

Tôi cũng đã vượt qua lỗi đó. Nó dường như không thích khi tôi cố gắng sử dụng các thuộc tính không được định nghĩa trong thực thể cha. Ngoài ra, tôi quyết định sử dụng một cách tiếp cận gần như chính xác như những gì bạn mô tả ở đây. Nó chắc chắn không phải là giải pháp lý tưởng, và tôi hy vọng ai đó có thể biết một mẹo mà chúng tôi không làm. Nếu không, tôi sẽ đánh dấu câu trả lời này sau một ngày. Cảm ơn. –