2012-10-26 36 views
10

Thiết lập:Làm thế nào để tạo ra một vị từ dữ liệu lõi để kiểm tra rằng một quan hệ có chứa tất cả các đối tượng nhất định?

Tôi có đối tượng Dữ liệu cốt lõi A có mối quan hệ rất nhiều với B. Gọi mối quan hệ "các mục". Vì vậy, a.items trả về tất cả các B-s được liên kết với A.

Bây giờ, tôi có một NSSet được tạo thủ công "itemSet" của các đối tượng B.

Tôi muốn làm như sau:

return all A objects whose "items" relation exactly matches itemSet 

Làm thế nào để xây dựng một vị cho rằng? Tôi đã thử điều này:

NSPredicate *predicate = [NSPredicate predicateWithFormat: 
          @"(ALL items in %@)", itemSet]; 

Nhưng điều đó chỉ mang lại cho tôi Unsupported predicate (null).

này:

NSPredicate *predicate = [NSPredicate predicateWithFormat: 
          @"(items in %@)", itemSet]; 

nói với tôi unimplemented SQL generation for predicate. Thú vị, nhưng không hữu ích.

Vậy, cách nào đúng để lọc mối quan hệ với một bộ?

Trả lời

19

Các vị sau đây có thể làm việc:

[NSPredicate predicateWithFormat:@"([email protected] == %d) AND (SUBQUERY(items, $x, $x IN %@)[email protected] == %d)", 
         itemSet.count, itemSet, itemSet.count]; 

Các kiểm tra ngữ đầu tiên mà số lượng các mặt hàng tương đương với kích thước của itemSet nhất định, và sau đó kiểm tra rằng số lượng các mặt hàng mà là thành viên của itemSet cũng bằng với kích thước của itemSet. Nếu cả hai đều đúng, thì items phải bằng itemSet.

+1

Thú vị. Những công việc này. Tôi có thể tìm hiểu thêm về SUBQUERY ở đâu? Tài liệu vị ngữ chính thức rất nhỏ trên đó. – Jaanus

+1

@Jaanus: Tôi sợ rằng tôi không có tài liệu tham khảo tốt hơn. Tôi đã học được nó chủ yếu bằng cách cố gắng để hiểu câu trả lời của người khác tại SO. –

+0

Tôi gặp sự cố liên quan đến việc không sử dụng dấu ngoặc đơn. Cảm ơn câu trả lời, @MartinR –

0

Các bạn đã thử:

NSPredicate *predicate = [NSPredicate predicateWithFormate:@"items == %@", itemSet]; 

Ngoài ra, kéo ra một tập hợp con với một vị đơn giản và lọc chúng bên ngoài được yêu cầu lấy. ví dụ:

  1. Đặt một vị cho số lượng các mục trong mối quan hệ với các giống như số lượng các mục trong bộ so sánh của bạn.
  2. Tìm nạp kết quả
  3. Lọc các kết quả này để chỉ hiển thị kết quả mà các bộ chứa cùng một mục.
+0

Có. Điều đó cho phép một ngoại lệ khác: '*** Chấm dứt ứng dụng do ngoại lệ chưa được nắm bắt 'NSInvalidArgumentException', lý do: 'không có nhiều khóa không được phép ở đây'' – Jaanus

+0

Lọc thủ công (tìm nạp đầu tiên theo số, sau đó lọc) chắc chắn là một tùy chọn, nhưng tạo lưu lượng CD không cần thiết. Tôi tự hỏi nếu điều này là doable với một vị ngữ ở tất cả hay không. – Jaanus

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