2012-02-13 5 views
8

Tôi đang cố gắng viết một phương thức cố gắng truy xuất một đối tượng dựa trên một biến vị ngữ sử dụng biến (như một phần của NSXMLParser). Mã này trông như thế này:Sử dụng biến cho Tên phần tử trong Dữ liệu cốt lõi Prutate

tôi có các biến này được định nghĩa trong lớp:

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; 

@property (strong, nonatomic) NSString *model; 
@property (strong, nonatomic) NSString *element; 

Bây giờ trong phương pháp này, tôi thiết lập các yêu cầu như thế này:

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:self.model inManagedObjectContext:self.managedObjectContext]; 
[request setEntity:entity]; 

Thách thức hiện nay - những gì tôi muốn để có thể làm là:

// DOES NOT WORK 
[request setPredicate:[NSPredicate predicateWithFormat:@"%@ == %@", self.element,string]]; 

B ut không trả lại bất kỳ kết quả nào. Sau khi một số mucking xung quanh, tôi nhận thấy rằng này không công việc:

if ([self.element isEqualToString:@"name"]) { 
    [request setPredicate:[NSPredicate predicateWithFormat:@"name == %@", string]]; 
} 

này nói với tôi rằng self.element của tôi được thiết lập một cách chính xác (? Tôi nghĩ), nhưng mà vị ấy không thích phía bên tay trái của biểu thức là một biến.

Tôi cũng đã cố gắng:

[request setPredicate:[NSPredicate predicateWithFormat:@"%s == %@", [self.element UTF8String],string]]; 

... chỉ để xem nếu có lẽ nó ưa thích một chuỗi. Tôi cũng không thể làm công việc đó.

Là những gì tôi đang cố gắng thậm chí có thể? Tôi đã đọc nhiều nhất có thể trong tài liệu Core Data và tôi không thể tìm thấy bất kỳ mã mẫu nào theo cách này, nhưng tôi cũng không tìm thấy gì để nói rằng điều đó là không thể.

EDIT: và bây giờ đoạn code làm việc:

[request setPredicate:[NSPredicate predicateWithFormat:@"%K == %@", self.element,string]]; 

Trả lời

14

Nếu bạn chưa từng làm trước đây, đọc Predicate Programming Guide và bạn có thể tìm thấy mọi thứ về các vị từ.

Bây giờ, nếu tôi đã hiểu chính xác, bạn muốn tạo một vị từ giữa hai chuỗi nhưng đầu tiên không phải là một chuỗi được xác định nhưng nó có thể thay đổi.
Tôi chưa từng sử dụng chúng trước đây nhưng tôi tin rằng bạn có thể giải quyết vấn đề của mình bằng cách sử dụng biến vị ngữ với tên thuộc tính động.

đây từ tài liệu: Tên

động tài sản
Bởi vì các biến chuỗi được bao quanh bởi dấu ngoặc kép khi chúng được thay ra một chuỗi định dạng sử dụng %@, bạn không thể sử dụng %@ để xác định một tên thuộc tính động — như được minh họa trong ví dụ sau.

NSString *attributeName = @"firstName"; 
NSString *attributeValue = @"Adam"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ like %@", attributeName, attributeValue]; 

Chuỗi định dạng vị ngữ trong trường hợp này được đánh giá là "firstName" như "Adam".

Nếu bạn muốn chỉ định tên thuộc tính động, bạn sử dụng %K trong chuỗi định dạng , như được trình bày trong đoạn sau.

predicate = [NSPredicate predicateWithFormat:@"%K like %@", attributeName, attributeValue]; 

Chuỗi định dạng ngữ trong trường hợp này để đánh giá FirstName như "A-đam" (lưu ý rằng không có dấu ngoặc kép quanh firstName).

Bạn cũng có thể tìm thêm thông tin tại đây: Predicate Format String Summary.

+0

Điều này là hoàn hảo, cảm ơn. Phần thông tin cụ thể làm cho mã của tôi hoạt động là biến% K xử lý đối số dưới dạng khóa thay vì giá trị. Bây giờ làm việc =) – valdarin

+0

bạn đang chào đón :) Dữ liệu cốt lõi và Predicates là công nghệ tuyệt vời và bạn có thể làm tất cả mọi thứ với họ ... – matteodv