2012-04-10 41 views
6

Tôi làm cách nào để tìm tất cả các danh mục có danh mục phụ có nhiều hơn 1 mục? Tôi đang sử dụng mã sau, nhưng tôi nhận được "nhiều khóa nhiều không được phép ở đây".NSPredicate to-many mối quan hệ

Tôi có cần sử dụng SUBQUERY không?

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Categories"]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY subcategories.items > 0"]; 
[request setPredicate:predicate]; 

Trợ giúp! :)

+0

Sử dụng nhiều NSPredicates qua NSCompoundPredicate. https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Predicates/Articles/pCreating.html –

+0

'mục' có thể là một tập hợp, thử sử dụng' @ count' –

Trả lời

3

Trong NSPredicate, bạn nên sử dụng [email protected] >0 để thay thế.

Nỗi buồn, điều đó sẽ chỉ hoạt động nếu các danh mục - danh mục con bỏ qua một - một.

Thực sự, những gì bạn nên làm, là xóa tất cả các Danh mục phụ không có mục nào, tôi nghĩ vậy.

Bạn chỉ nên kiểm tra xem có bất kỳ danh mục phụ nào và điều đó có nghĩa là chúng không trống. [email protected] >0

+0

Cảm ơn sự giúp đỡ của bạn.Nhận 'NSInvalidArgumentException', lý do: 'Số biểu thức hàm không được hỗ trợ: (subcategories.items)'. Danh mục có mối quan hệ nhiều với các danh mục con và mối quan hệ nhiều mục đến Danh mục với nhiều mục. – Nimrod7

2

Bạn chỉ có thể sử dụng mối quan hệ một-nhiều trong phần phụ trợ SQL. Điều này sẽ làm điều đó, nhưng bạn phải thêm "back-link" vào một bộ theo thứ tự (để giữ trật tự nếu bạn sử dụng phân loại - và tính duy nhất bởi vì bạn có thể nhận được nhiều tiểu thể loại quay trở lại cùng một thể loại). Không lý tưởng, nhưng không tệ, xem xét những hạn chế.

// Search for all subcategories with item count > 0 
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Subcategory"]; 
request.predicate = [NSPredicate predicateWithFormat:@"[email protected] > 0"]; 
NSError *error = nil; 
// They should have an inverse relationship to their category... 
// We have to iterate and insert them in to a set, but there is no additional 
// disk access. 
NSMutableOrderedSet *results = [NSMutableOrderedSet orderedSet]; 
[[self.projectDatabase.managedObjectContext executeFetchRequest:request error:&error] enumerateObjectsUsingBlock:^(Subcategory *obj, NSUInteger idx, BOOL *stop) { 
    [results addObject:obj.category]; 
}]; 

EDIT

Thật không may, tôi không nghĩ rằng đây là có thể với các cửa hàng SQL. Đầu tiên, hãy để tôi nhấn mạnh rằng tôi không ở gần một chuyên gia SQL nào, và tôi thường cố gắng thiết kế các cửa hàng CoreData của mình để các loại truy vấn này không cần thiết. Tuy nhiên, SUBQUERY sau hoạt động với một cửa hàng InMemory, do đó, nó là một truy vấn con được định dạng đúng cách.

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(subcategories, $s, [email protected] > 0)[email protected] > 0"]; 

Tuy nhiên, vị từ đó có lỗi khi sử dụng cửa hàng SQL. Các tài liệu nói rằng có một số lượng hợp lý các giới hạn khi sử dụng các vị từ với các cửa hàng SQL, vì vậy tôi không ngạc nhiên, cũng không nghiêng quá nhiều thời gian nghiên cứu này.

Đường chạy có chứa KVC tổng hợp nơi không nên có; thất bại để xử lý $ s.items. @ đếm

+0

Chỉ cần đi xung quanh để thử một cách tiếp cận khác. Điều này có làm điều đó cho bạn? –

+0

yep, thats những gì tôi đang sử dụng, nhưng tôi đã tìm cách để làm điều đó thông qua subquery hoặc @count (nếu có một cách) ở cấp cơ sở dữ liệu. Tôi không chắc chắn nếu lặp lại là cách hiệu quả nhất. – Nimrod7

9

Dựa trên kinh nghiệm của tôi, bạn nên thay đổi chuỗi định dạng vị trong

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY subcategories.items > 0"];  

từ

@"ANY subcategories.items > 0" 

vào

@"[email protected] > 0" 

Lưu ý rằng nút ANY bất kỳ thứ cần phải đi là tốt, hoặc bạn sẽ được truy vấn tài sản một cách sai lầm.

+0

làm tăng NSInvalidArgumentException, vì các danh mục con và mục được đặt. – Nimrod7

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