2010-10-15 26 views
9

Tôi đang cố gắng truy vấn một bảng bằng cách sử dụng NSPredicate. Đây là những gì tôi đang làm:NSPredicate vấn đề với tên cột

NSNumber *value = [NSNumber numberWithInteger: 2]; 
NSString *columnName = @"something_id"; 

NSLog(@"%@ == %@", columnName, value); 
NSPredicate *refQuery = [NSPredicate predicateWithFormat: @"%@ == %@", columnName, value]; 

NSLog in ra những gì tôi mong đợi ("something_id == 2"), nhưng biến vị ngữ không hoạt động. Tuy nhiên, vị KHÔNG làm việc nếu tôi thay đổi nó để:

NSPredicate *refQuery = [NSPredicate predicateWithFormat: @"something_id == %@", value]; 

Vậy tại sao sẽ không làm việc này và làm thế nào tôi có thể sửa chữa nó?

+0

Điều đó rất kỳ quặc ... cũng xảy ra với tôi .. –

Trả lời

30

The Predicate Programming Guide from Apple nói:

% @ là một var arg thay thế cho một đối tượng giá trị gia thường là một chuỗi, số, hoặc ngày.

% K là thay thế var arg cho đường dẫn chính.

Khi biến chuỗi được thay thế thành chuỗi định dạng sử dụng% @, chúng được bao quanh bởi dấu ngoặc kép. Nếu bạn muốn chỉ định tên thuộc tính động, hãy sử dụng % K trong chuỗi định dạng.

Vì vậy, trong trường hợp của bạn, bạn cần phải đặt% K như một keypath để ColumnName, không phải% @ mà sẽ được bổ sung với dấu ngoặc kép:

NSPredicate *refQuery = [NSPredicate predicateWithFormat: @"%K == %@", columnName, value]; 

Hy vọng điều này rõ ràng nghi ngờ của bạn.

+0

FWIW muốn sử dụng% K trên cả hai mặt của biến vị ngữ, vì các số nguyên thay thế sẽ được bao bọc sai trong các dấu ngoặc kép. – ImHuntingWabbits

+0

Không, giá trị không phải là số nguyên, nhưng đó là một số NSNumber, như bạn có thể thấy trong tài liệu, đó là định dạng phù hợp. –

+0

Cảm ơn, đã cứu tôi khỏi đau đầu đau đớn. :) –

1

Rất kỳ lạ, nhưng tôi nghĩ rằng tôi đã giải quyết nó bằng cách làm như sau:

NSNumber *value = [NSNumber numberWithInteger: 2]; 
NSString *columnName = @"something_id"; 

NSString *predicate = [NSString stringWithFormat: @"%@ == %@", columnName, value]; 
NSPredicate *refQuery = [NSPredicate predicateWithFormat: predicate]; 
+0

Nếu ai đó có thể làm sáng tỏ lý do tại sao điều này xảy ra, tôi sẽ rất biết ơn. – henryeverett

+0

Bởi vì ở đây bạn cung cấp "something_id == 2", nếu bạn để định dạng chuỗi, nó sẽ xuất ra: "something_id" == 2, do đó trường sẽ trở thành chuỗi và không phải là trường không có dấu ngoặc kép – Climbatize