2009-09-24 26 views
62

Tôi đang triển khai trường tìm kiếm nơi người dùng có thể nhập vào chuỗi để lọc các mục được hiển thị trong chế độ xem. Mỗi đối tượng được hiển thị có mối quan hệ nhiều với keywords và tôi muốn có thể lọc các đối tượng dựa trên từ khóa của họ. Mỗi đối tượng từ khóa có một tài sản name, vì vậy tôi đã thiết lập một NSPredicate để làm lọc trông như thế này:Khớp nối không phân biệt chữ hoa chữ thường trên quan hệ nhiều-nhiều

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"keywords.name CONTAINS %@", self.searchString]; 

này hoạt động, nhưng vấn đề là tìm kiếm là trường hợp nhạy cảm, do đó nếu từ khóa có chữ cái viết hoa nhưng người dùng nhập tất cả chữ thường, không tìm thấy kết quả phù hợp nào. Tôi đã thử sửa đổi sau:

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"keywords.name CONTAINS[c] %@", self.searchString]; 

Nhưng điều đó không tạo ra sự khác biệt nào về độ nhạy của trường hợp khớp. Có cách nào để thực hiện việc so khớp không phân biệt dạng chữ này chỉ bằng một biến vị ngữ đơn giản không? Hoặc tôi sẽ cần triển khai một số loại trình truy cập tùy chỉnh trên lớp từ khóa, ví dụ: viết phương pháp lowercaseName và đối sánh với phiên bản chuỗi tìm kiếm thấp hơn thay vào đó?

Phụ Lục: Sau khi tiếp tục thăm dò, thực hiện giải pháp của việc thêm một accessor tùy chỉnh hoạt động OK để sử dụng nhãn hiệu của NSPredicate, nhưng không làm việc ở tất cả khi sử dụng NSFetchRequest với Core Data, mà chỉ có tác dụng khi truy vấn thuộc tính được định nghĩa trong dữ liệu cốt lõi mô hình.

Trả lời

79

Nếu tôi hiểu bạn một cách chính xác, bạn muốn vị ngữ của bạn đến mức khó tin bất cứ khi nào bất kỳ tên từ khóa phù hợp với chuỗi tìm kiếm. Đối với điều này, bạn cần phải thử nghiệm với các từ khóa BẤT CỨ như thế này:

[NSPredicate predicateWithFormat:@"ANY keywords.name CONTAINS[c] %@", ...]; 

Điều này sẽ tìm kiếm từ khóa và trả về true nếu bất kỳ tên từ khóa nào chứa chuỗi tìm kiếm của bạn.

+1

Tôi biết phải có một cách tôi đã mất tích. Làm việc như một say mê. Cảm ơn! –

42

Tôi tin rằng câu trả lời là:

[NSPredicate predicateWithFormat:@"keywords.name CONTAINS[cd] %@", self.searchString]; 

String comparisons are by default case and diacritic sensitive. You can modify an operator using the key characters c and d within square braces to specify case and diacritic insensitivity respectively, for example firstName BEGINSWITH[cd] $FIRST_NAME.

Predicate Format String Syntax

+0

Về cơ bản giống như lần thử thứ hai của tôi được đăng trong câu hỏi ban đầu, chỉ việc thêm cờ dấu phụ là khác nhau. Vấn đề là điều này không hoạt động khi phía bên tay trái của biểu thức không phải là một chuỗi đơn giản. –

+1

Đối với tôi, tùy chọn [d] cho tôi lỗi này: 'Chấm dứt ứng dụng do không có ngoại lệ 'Tùy chọn biến vị ngữ không hợp lệ', lý do: 'NSDiacriticInsensitivePredicateOption không được hỗ trợ cho loại chuỗi'' – Zeb

+0

tôi nữa. Tôi gặp lỗi tương tự. –

12

Nếu bạn đang cố gắng để bắt chỉ bằng tên, nhưng với trường hợp không nhạy cảm, tôi nghĩ rằng đó là giải pháp tốt nhất

[NSPredicate predicateWithFormat:@"ANY keywords.name LIKE[c] %@", ...]; 

Bạn đã giúp tôi rất nhiều. Cảm ơn các bạn!!!

Trong trường hợp của tôi, tôi đã làm:

[NSPredicate predicateWithFormat:@"ANY name LIKE[c] %@", @"teste"]; 
+0

'LIKE' là toán tử kết hợp (? *). Điều này sẽ chỉ hoạt động chính xác nếu chuỗi bạn truyền cho '% @' là một mẫu toàn cục, vì vị từ sẽ diễn giải nó như là một; nếu chuỗi không phải là một mẫu hình cầu, chuyển nó ở nơi một quả cầu được mong đợi sẽ gây ra vấn đề. Sử dụng == nếu bạn muốn sự bình đẳng nghiêm ngặt. –

+7

OH MAN !!!!!!!!!! Điều này cũng hoạt động .. == [c]. Tôi chưa thử cái này! Cái gì thế này, tôi googled nó nhưng ... Nó có biểu hiện bình thường không? – wal

+0

Không. Globs là loại mẫu bạn sử dụng trong trình bao để khớp với nhiều tên tệp cùng một lúc. –

1

Nếu bạn muốn cả hai trường hợp không nhạy cảm và ký tự đại diện, sử dụng này:

NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(name like[c] '*%@*')",@"search"]]; 
+1

'NSPredicate * predicate = [NSPredicate predicateWithFormat: @" (tên như [c] '*% @ *') ", @" search "];' là đủ. – Zeb

2

Nếu bạn phải phù hợp với từ khóa tìm kiếm nhưng phải được đựng pin- nhạy cảm thì bạn nên sử dụng NSPredicate(format: "keywords.name =[c] %@", self.searchString)

LIKE không hoạt động trên chuỗi ký tự chuỗi.

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