2010-09-05 26 views
6

Dưới đây là mô hình tôi có: http://www.girardet.ch/model.pngCore Data, cố gắng sử dụng NSPredicate để lọc một mối quan hệ toMany thiết nhưng có được "to-many chìa khóa không được phép ở đây" lỗi

Mục tiêu của tôi là để lấy tất cả các Quotes với các tiêu chí:

  • thuộc về một chủ đề cụ thể: các thuộc tính name_en của chủ đề
  • trật tự bởi tính thích hợp
  • lọc bởi tác giả (với thuộc tính bí danh của tác giả)
  • 0.123.

Đây là mã của tôi:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"ThemeEntries" inManagedObjectContext:_context]; 
[fetchRequest setEntity:entity]; 

NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"relevancy" ascending:NO]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, nil]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 

// predictate - filter 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"theme.name_en=%@ AND quotes.author.alias=%@",@"mytheme", @"myauthor"]; 

[fetchRequest setPredicate: vị ngữ];

Tôi nhận được lỗi "không được phép nhiều ở đây".

Nếu tôi thay vì sử dụng vị này

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"theme.name_en=%@, @"mytheme"]; 

nó hoạt động tốt và tôi có thể lặp qua ThemeEntries mà tôi nhận được và nhận được tất cả dấu ngoặc kép của tôi ... Nhưng nó không được lọc bởi tác giả.

Tôi có thể làm gì để lọc theo Tác giả?

Trả lời

26

Vấn đề của bạn là mối quan hệ của một trong các keypath của bạn là một nhiều, nhiều và vị ngữ không biết đối tượng cụ thể nào đi kèm.

Bạn có ThemeEntities<<-->>Quotes tạo bộ ở mỗi đầu. Đường dẫn khóa quotes.author.alias cho biết "một tập hợp các trường hợp trích dẫn, mỗi trường hợp được liên kết với các trường hợp tác giả, lần lượt có thuộc tính bí danh". Vị từ không thể xử lý tập hợp.

Bạn cần sử dụng truy vấn phụ để chuyển đường phím khóa tới nhiều. Truy vấn con về bản chất là một biến vị ngữ lồng nhau tìm kiếm một tập hợp và trả về một tập các đối tượng khác khớp với vị từ lồng nhau. Các truy vấn con không được ghi nhận đầy đủ nhưng có dạng:

SUBQUERY(collectionName,$collectionElementVariable,expression-with-$collectionElementVariable) 

Trong trường hợp này, bạn đang tìm kiếm bất kỳ trường hợp báo giá nào có mối quan hệ tác giả với bí danh khớp với chuỗi được cung cấp. vị ngữ của bạn sẽ cần phải xem xét như:

@"theme.name_en=%@ AND (0!=SUBQUERY(quotes,$eachQuote,$eachQuote.author.alias=%@)[email protected])",@"mytheme", @"myauthor" 

Các subquery nói: "Trong số các bộ dấu ngoặc kép, lấy từng đối tượng báo giá và kiểm tra nếu đối tượng mối quan hệ tác giả của nó có một thuộc tính bí danh phù hợp với 'myauthor' Đếm số. báo giá các đối tượng với khớp đó. Nếu số không khác, trả về TRUE. "

Bạn cần phải sử dụng truy vấn phụ bất cứ khi nào bạn đi bộ một đường phím trên một mối quan hệ nhiều.

+0

Cảm ơn đống cho câu trả lời tuyệt vời này. Tôi không biết về các truy vấn con và nó chắc chắn rất hữu ích. Tuy nhiên, trong trường hợp của tôi, tôi muốn lọc tập hợp các dấu trích dẫn được trả về bởi yêu cầu "bên trong" tất cả các ThemeEntries. Sử dụng truy vấn phụ có thể lọc các mục được trả lại, đảm bảo rằng chúng có mối quan hệ với tác giả thông qua các dấu ngoặc kép mà chúng có liên quan đến. Những gì tôi cuối cùng đã làm là nhận được tất cả các dấu ngoặc kép liên quan đến chủ đề mà không lọc tác giả và lọc chúng sau đó.Nhưng tôi vẫn tự hỏi nếu có một cách để làm nó trực tiếp trong yêu cầu (như một tham gia bên trái sẽ làm trong sql) – Ben

+0

Không chính xác chắc chắn những gì bạn đang tìm kiếm nhưng vị từ trên chỉ tìm kiếm những trường hợp 'Trích dẫn' liên quan đến cụ thể' Trường hợp ThemeEntities'. Trong thực tế, do các biến vị ngữ được đánh giá như thế nào, nó sẽ chỉ kiểm tra các cá thể 'Trích dẫn' đó cho' ThemeEntities' mà vượt qua bài kiểm tra đầu tiên. – TechZen

+0

Cảm ơn bạn đã giải quyết @TechZen này !!! Chết tiệt, tôi đã đấu tranh với điều này trong nhiều giờ, cố gắng tìm ra cách để tạo ra một biến vị ngữ phức hợp áp dụng một bộ lọc sử dụng hai tiêu chí cho cùng một phần tử thu thập. Điều này cực kỳ dễ dàng với sự giúp đỡ của câu trả lời của bạn. Cảm ơn! –

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