2010-01-05 38 views
21

Tôi có ba thực thể: EntityA, EntityB và EntityC được kết nối với nhiều mối quan hệ.Cách nào tốt hơn để xây dựng NSPredicate với nhiều mối quan hệ sâu sắc?

schema Xem để biết chi tiết:

alt text http://img706.imageshack.us/img706/9974/screenshot20091220at124.png

Đối nhận được tất cả thể hiện của EntityA mà phụ thuộc từ EntityB.name tôi sử dụng vị như thế này:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY EntityB.name like 'SomeName'"]; 

gì nên vị để nhận tất cả các trường hợp của EntityA mà phụ thuộc từ EntityC.name? Tôi đã thử truy vấn như @"ANY EntityB.entitiesC.name like 'SomeName'" nhưng nhận ngoại lệ "multiple to-many keys not allowed here".

Trân trọng,

Victor

Trả lời

12

Giải pháp cuối cùng của tôi là sử dụng SUBQUERY.

NSPredicate *p = [NSpredicate predicateWithFormat:@"(name like %@) AND (0 != SUBQUERY(entitiesB, $x, (0 != SUBQUERY($x.entitiesC, $y, $y.name like %@)[email protected]))[email protected])", nameA, nameC]; 

Rất tiếc, tôi không thể mở rộng truy vấn này trên các đối tượng nsExpression.

+0

Tính năng này có hoạt động với cửa hàng SQLite cho cả Mac OS và iOS không? Từ tài liệu của Apple (từ thư viện iOS 5.0: Hướng dẫn lập trình dữ liệu cốt lõi> Tính năng lưu trữ lâu dài> Tìm nạp số mũ và bộ mô tả sắp xếp - có thể khác với Mac OS): "Có những hạn chế bổ sung đối với các biến vị ngữ bạn có thể sử dụng Cửa hàng SQLite: Bạn không nhất thiết có thể dịch các truy vấn SQL "tùy ý" thành các biến vị ngữ ". – Dalmazio

+0

Tôi chưa thử nghiệm nó trong hệ điều hành Mac nhưng cho iOS hoạt động tốt. – Victor

2

Trong khi tôi đang dừng lại tại các quyết định sau đây:

Trước tiên, tôi nhận được tất cả các EntityC đáp ứng các điều kiện EntityC.name bằng 'somename'

NSPredicate *p = [NSPredicate predicateWithFormat:@"name like %@", @"SomeName]; 

...

NSArray *res = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

Sau đó, tôi nhận được một loạt các EntityB từ trên truy vấn

NSArray *parentBs = [res valueForKeyPath:@"@distinctUnionOfObjects.parent"]; 

Thần có được mảng của EntityB đáp ứng các điều kiện EntityB.EntitiesC.name bằng 'somename':

NSExpression *leftExpression = [NSExpression expressionForEvaluatedObject]; 
NSExpression *rightExpression = [NSExpression expressionForConstantValue:parentBs]; 

NSPredicate *p = [NSComparisonPredicate predicateWithLeftExpression:leftExpression rightExpression: rightExpression modifier:NSDirectPredicateModifier type:NSInPredicateOperatorType options:0]; 

Tôi lặp lại tương tự cho EntityA.

Hiệu quả của giải pháp này nghi ngờ và tôi vẫn mong đợi một giải pháp tốt hơn cho vấn đề này.

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