2011-09-12 26 views
5

Tôi cố gắng tìm ra cách nối các tên thuộc tính. Tôi có một thuộc tính quận và thuộc tính mà tôi muốn truy vấn nhưNSPredicate concatenating attributes

[NSPredicate predicateWithFormat:@"county + district contains[cd] %@",searchBar.text] 

cung cấp cho tôi thế hệ SQL chưa được thực hiện cho lỗi vị ngữ. và tôi không chắc chắn làm thế nào để thực hiện NSPredicate. Cảm ơn

Trả lời

7

Điều này sẽ cung cấp cho bạn ý tưởng về cách thực hiện một số tìm kiếm phức tạp hơn. Nó sẽ đối sánh các truy vấn cho "quận hạt", "quận hạt", v.v.

NSArray *searchTerms = [searchBar.text componentsSeparatedByString:@" "]; 
    NSString *predicateFormat = @"(county contains[cd] %@) OR (district contains[cd] %@)"; 
    NSPredicate *predicate; 
    if ([searchTerms count] == 1) { 
     NSString *term = [searchTerms objectAtIndex:0]; 
     predicate = [NSPredicate predicateWithFormat:predicateFormat, term, term]; 
    } else { 
     NSMutableArray *subPredicates = [NSMutableArray array]; 
     for (NSString *term in searchTerms) { 
      NSPredicate *p = [NSPredicate predicateWithFormat:predicateFormat, term, term]; 
      [subPredicates addObject:p]; 
     } 
     predicate = [NSCompoundPredicate andPredicateWithSubpredicates:subPredicates]; 
    } 
    [fetchRequest setPredicate:predicate]; 

Xem Cocoa Is My Girlfriend: Adding iTunes-style search to your Core Data application để được giải thích thêm.

+1

Điều đó không tương đương. nối "ABC" + "DEF" sẽ khớp với "CDE". Giải pháp của bạn sẽ không. Tôi hiểu rằng trong bối cảnh OP có thể không phải là một vấn đề. Nó sẽ là của tôi. Vì vậy, câu hỏi là viết tắt: làm thế nào để bạn nối 2 cột của một thực thể trước khi khớp? –

+1

@ Jean-DenisMuys bạn đã bao giờ tìm ra câu trả lời chưa? http://xkcd.com/979/ – figha

+0

Tôi đã kết thúc thêm một thuộc tính có nguồn gốc mà tôi tính toán để được nối của hai nguồn. Sau đó tôi có một vị từ trên thuộc tính có nguồn gốc đó. Điều này lãng phí lưu trữ trong cơ sở dữ liệu CoreData của tôi, nhưng đó là một mức giá tôi có thể trả trong trường hợp của tôi. Tôi có thể đã làm cho nó một thuộc tính thoáng qua, nhưng tôi không chắc chắn bạn có thể truy vấn trên một. (TBH, tôi thậm chí không thử) –

0
[NSPredicate predicateWithFormat:@"county contains[cd] %@ AND district contains[cd] %@",searchBar.text,searchBar.text]; 

Chỉ cần thử các dòng mã ở trên, nó sẽ giúp bạn.

+0

đó sẽ là một 'hành OR', nếu tôi hiểu mục đích OP đúng –

+0

@ Jean-DenisMuys trong câu hỏi ông nêu thats huyện quốc gia + lý do tại sao tôi đã sử dụng và đây – Raj

+1

Fine. Tuy nhiên, điều này không trả lời câu hỏi ban đầu của OP, đó là "cách ghép các thuộc tính [theo] tên [trong các vị từ]?", Ngay cả khi OP không * có nghĩa là * chính xác như vậy. –

3

Tôi đã kết thúc thực hiện một trường khác như nối hai biến (quận + quốc gia) và thực hiện truy vấn trên biến đó.

+0

Nó có thể hữu ích với một đoạn mã để mọi người học hỏi? – Monolo

1

tôi đã làm một cái gì đó tương tự và kết luận rằng như cekisakurek, phương pháp tốt nhất là để nối các lĩnh vực vào một trường chung (phù hợp hơn cho lần đầu tiên tên/ngoái)

- (NSString *)fullName { 
    return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName]; 
} 

và sau đó được lọc trên lĩnh vực này sử dụng ' chứa [cd]

[NSPredicate predicateWithFormat:@"fullName contains[cd] %@", self.searchBar.text];