2012-11-02 33 views
8

Tôi đã đưa ra một giải pháp cho việc này bằng truy vấn phụ, nhưng tôi không hiểu tại sao những gì tôi đã cố gắng làm trước đã không hoạt động.Dữ liệu cốt lõi, NSPredicate, BẤT K key key.path == nil

Đây là mô hình dữ liệu của tôi. Tôi đang tìm trên Advice.

enter image description here

tôi có thể làm như sau như một vị:

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == %@", aTerrainObject]; 

rằng hoạt động tốt, và trả về bất kỳ lời khuyên có ít nhất một trong những điều kiện của nó có kiểu địa hình.

Tuy nhiên, khi tôi cố gắng để làm điều này, nó không thành công:

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == nil"]; 

Những gì tôi muốn làm là trả lại bất kỳ lời khuyên có ít nhất một trong những điều kiện của nó không có một bộ loại địa hình.

Tuy nhiên, sau đây làm việc:

[NSPredicate predicateWithFormat:@"SUBQUERY(conditions, $x, $x.terrain == nil)[email protected] > 0"]; 

bất cứ ai có thể giải thích tại sao, khi tìm kiếm bằng không, tôi không thể sử dụng cú pháp ANY?

+0

Điểm tốt ở đây. + 1 –

Trả lời

24

Bất cứ ai có thể giải thích tại sao, khi tìm kiếm nil, tôi không thể sử dụng cú pháp BẤT CỨ?

Yep! Đây là những gì đang xảy ra.

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == nil"]; 

Trước tiên, hãy chia nhỏ ra thành các từ ngữ thích hợp trái và phải:

conditions.terrain 

này sẽ được đánh giá bằng cách lấy đối tượng SELF (một thể hiện Advice) và yêu cầu valueForKeyPath:@"conditions.terrain". Kết quả của keypath này sẽ là một bộ sưu tập. Về cơ bản bạn đang thực hiện:

Advice *a = ...; 
NSSet *conditions = [a conditions]; 
NSSet *terrains = [conditions valueForKey:@"terrain"]; 

Vì vậy, bạn có một bộ sưu tập (tiềm năng) Terrain trường hợp. Bây giờ, chúng ta biết gì về các bộ sưu tập trong Objective-C? Một điều, chúng không thể chứa nil. Chúng chỉ có thể chứa các đối tượng.Điều này có nghĩa là khi nó thực thi phần ANY của biến vị ngữ, nó sẽ lặp qua các mục trong mảng và thấy rằng không có mục nào trong số đó là nil.

Do đó, vị từ của bạn không thành công. Tôi đã thử chơi với một số biến thể khác (sử dụng [NSNull null] thay vì nil, v.v.) nhưng không có biến thể nào trong số đó có vẻ hoạt động.

Do đó, có vẻ như bạn sử dụng số SUBQUERY để giải quyết vấn đề này là tốt nhất có thể. Tôi rất muốn giới thiệu filing a bug nêu chi tiết mong đợi của bạn và thể hiện lý do bạn cho rằng điều này sẽ hiệu quả.

+1

+1 cho giải thích sâu. –

+0

Trả lời tuyệt vời. Cảm ơn bạn đã được toàn diện và chính xác. –

0

Tôi tin rằng bạn không thể sử dụng nil trong truy vấn. Bạn có thể sử dụng NULL hoặc chuỗi định dạng có cấu trúc như "ANY conditions.terrain == %@", nil.

gì tôi bối rối là subquery bạn đang làm việc ...

Trên đây là không đúng, như NULLNIL thể được sử dụng thay thế cho nhau.

Thay vào đó, NSExpression Class Reference cung cấp chính xác mẫu của bạn (với @count) làm ví dụ được ưu tiên.

Bạn có kiểm tra xem mối quan hệ địa hình là tùy chọn không?

+0

Yup, tùy chọn. –

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