2009-10-16 5 views
6

Tôi có nhu cầu tạo một biến vị ngữ phức tạp cho một đối tượng cơ sở trừu tượng. Tôi muốn có các truy vấn vị ngữ riêng biệt cho các thực thể kế thừa khác nhau và khóa loại thực thể con, ví dụ dưới đây là những gì tôi muốn làm, tuy nhiên, tôi không thể tìm cách để tham chiếu tên thực thể hoặc nhập vị ngữ.Làm cách nào bạn có thể tham chiếu tên thực thể con trong vị từ cho yêu cầu tìm nạp của thực thể cha?

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
request.entity = [NSEntityDescription entityForName:@"MyCommonObjectBase" inManagedObjectContext:myContext]; 

NSPredicate *subclassAPredicate = [NSPredicate predicateWithFormat:@"someValue > %@ && entityName = %@", 100, @"SubclassA"]; 
NSPredicate *subclassBPredicate = [NSPredicate predicateWithFormat:@"someValue < %@ && entityName = %@", 50, @"SubclassB"]; 

request.predicate = [NSCompoundPredicate orPredicateWithSubpredicates:[NSArray arrayWithObjects:subclassAPredicate, subclassBPredicate, nil]]; 

Trả lời

10

tôi nhận được một câu trả lời từ Apple tại http://bugreport.apple.com vấn đề số 7.318.897:

entity.name không phải là một tài sản theo mô hình, vì vậy nó không hợp pháp. nó hoạt động một cách tình cờ trên cửa hàng nhị phân. Cách chính xác để tìm nạp subentities là làm như vậy trên NSFetchRequest và sử dụng setIncludesSubentities hay không.

Vì vậy, có vẻ như giải pháp thích hợp là có các yêu cầu tìm nạp riêng biệt và hợp nhất các tập kết quả sau khi thực thi.

+0

vì vậy những gì bạn đang nói là, vấn đề của tôi không có một giải pháp hơn là để lấy kết quả đầu tiên và sau đó áp dụng các vị từ còn lại trên kết quả trong tay? http://stackoverflow.com/questions/11934763/nspredicate-on-nested-object-nsset-to-filter-the-result-during-nsfetchrequest – yunas

+0

Thật không may là có. –

3

Một ảnh chụp trong bóng tối ở đây, nhưng cách sử dụng giá trị className ở vị từ?

NSPredicate *subclassAPredicate = [NSPredicate predicateWithFormat:@"someValue > %d AND child.className = %@", 100, @"SubclassA"]; 

(Chú ý rằng bạn đã có một lỗi trong định dạng ngữ của bạn. Bạn đang sử dụng %@ để thử và thay thế trong một giá trị số nguyên (100). %@ chỉ được sử dụng cho các đối tượng. Sử dụng %d (hoặc một số hương vị khác) cho nguyên thủy)

EDIT Tìm thấy nó!

Bạn sẽ muốn làm điều này:

NSPredice * p = [NSPredicate predicateWithFormat:@"entity.name = %@", @"SubclassA"]; 

tôi chỉ thử nghiệm này trên một trong những ứng dụng của tôi và có vẻ như để làm việc.

-Another Edit-

Dưới đây là các bài kiểm tra đó tôi chạy, mà dường như làm việc:

NSManagedObjectContext * c = [self managedObjectContext]; 
NSFetchRequest * f = [[NSFetchRequest alloc] init]; 
[f setEntity:[NSEntityDescription entityForName:@"AbstractFolder" inManagedObjectContext:c]]; 
[f setPredicate:[NSPredicate predicateWithFormat:@"entity.name = %@", @"DefaultFolder"]]; 
NSError * e = nil; 
NSArray * a = [c executeFetchRequest:f error:&e]; 
[f release]; 
NSLog(@"%@", a); 

Khi tôi chạy đó, a bản ghi hai NSManagedObjects, cả hai @"DefaultFolder" nhiều (đó là những gì Tôi đã mong đợi). (AbstractFolder là một thực thể trừu tượng Một trong những đơn vị con được thừa kế từ nó là một DefaultFolder.)

+0

Tôi sẽ chụp ảnh đó, cảm ơn. Vâng, đó là lỗi đánh máy từ việc tổng hợp một số mã sản xuất vì mục đích minh họa. –

+0

Không may mắn, className không phải là một keypath hợp lệ. Ngoài ra, tôi đang tìm kiếm tên thực thể của bản thân không phải là một thực thể con để làm rõ. –

+1

@Greg Tôi tìm thấy cách hoạt động và chỉnh sửa câu trả lời của mình. –

-1

Cách duy nhất của liên kết một vị với một thực thể tôi biết như là thế này:

NSPredicate * predicate = [NSPredicate predicateWithFormat: @"(%K == %@)", fieldName, fieldValue, nil]; 
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
[request setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext]]; 
[request setPredicate:predicate]; 

Có lẽ bạn đã đề cập đến tên trường?

Chỉnh sửa: thực thể được liên kết với yêu cầu, không phải với vị từ.