2009-08-28 20 views
22

Tôi có mô hình Dữ liệu cốt lõi trong đó thực thể Tác vụ bao gồm mối quan hệ tùy chọn nhiều-nhiều bị loại trừ vào thực thể ExcludedDay. Một trong các thuộc tính của ExcludedDay là ngày, là một đối tượng NSDate. Thực thể ExcludedDay có một mối quan hệ nghịch đảo bắt buộc nghịch đảo đối với thực thể Task.Làm thế nào để thiết lập chính xác một NSPredicate cho một mối quan hệ nhiều-nhiều khi sử dụng dữ liệu lõi?

Để tìm nạp tác vụ cho một ngày cụ thể, tôi cần đảm bảo rằng ngày được chỉ định không xuất hiện dưới dạng thuộc tính ngày của bất kỳ thực thể ExludedDay nào.

tôi bắt đầu cố gắng

NSPredicate *dayIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"ALL excludedDays.day != %@", today]; 

Tuy nhiên, bất chấp những gì tài liệu nói rằng, tất cả không làm việc và ứng dụng ném một ngoại lệ: Chấm dứt ứng dụng do ngoại lệ còn tự do ‘NSInvalidArgumentException’, lý do: ‘ngữ không được hỗ trợ.

Sau khi đăng cùng một câu hỏi trong diễn đàn này, tôi đã có thể đưa ra các vị sau đây với sự giúp đỡ của mọi người khác nhau:

NSPredicate * dayIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"[email protected] == 0 || ([email protected] > 0 && NONE excludedDays.day == %@))", today]; 

Trong khi điều này làm việc lúc đầu, tôi vừa phát hiện ra rằng đây chỉ hoạt động khi thực thể ExcludedDay chỉ chứa một ngày. Ngay khi thực thể ExcludedDay chứa nhiều hơn một ngày cho cùng một tác vụ, vị từ này ngừng hoạt động. Kết quả là, một nhiệm vụ được chọn cho một ngày mặc dù ngày xuất hiện dưới dạng một ngày trong thực thể ExcludedDay, điều này tất nhiên là sai. Vấn đề không được gắn với ngày bất động sản là một đối tượng NSDate: thay thế ngày bằng NSString tương ứng hoặc tương đương với một số nguyên, tôi vẫn phải đối mặt với cùng một vấn đề và hành vi không chính xác.

Cách chính xác để triển khai biến vị ngữ trong trường hợp này là gì? Có thể đây là lỗi liên quan đến BẤT CỨ toán tử tổng hợp khi sử dụng dữ liệu lõi? Cảm ơn bạn trước, điều này hiện đang khiến tôi phát điên.

Trả lời

42

Hóa ra đây là một vấn đề khác với mất tích và/hoặc tài liệu không phù hợp.

Các vị đúng trong trường hợp này là một trong những sau:

[NSPredicate predicateWithFormat:@"([email protected] == 0) OR (0 == SUBQUERY(excludedOccurrences, $sub, $sub.day == %@)[email protected])", today] 

Trong ngữ, một subquery được sử dụng để kiểm tra nếu số lượng excludedOccurrences có liên quan với một ngày phù hợp với ngày thi của bạn là bằng không.Tuy nhiên, tài liệu là gây hiểu lầm. Dưới đây là những gì Hướng dẫn lập trình Predicate nói về việc sử dụng các vị từ kết hợp với nhiều mối quan hệ.

Sử dụng các mối quan hệ với các mối quan hệ

Nếu bạn sử dụng mối quan hệ nhiều, việc xây dựng một vị ngữ hơi khác. Nếu bạn muốn lấy cục trong đó có ít nhất một trong những nhân viên có tên đầu tiên "Matthew", ví dụ, bạn sử dụng một BẤT CỨ điều hành như trong ví dụ sau:

NSPredicate *predicate = [NSPredicate predicateWithFormat: 
    @"ANY employees.firstName like 'Matthew'"]; 

Nếu bạn muốn tìm Sở trong đó tất cả nhân viên được thanh toán nhiều hơn một số tiền nhất định, bạn sử dụng toán tử ALL như được hiển thị trong ví dụ sau:

float salary = ... ; 
NSPredicate *predicate = [NSPredicate predicateWithFormat: 
    @"ALL employees.salary > %f", salary]; 
+0

Có thể bạn biết cách viết biểu thức với SUBQUERY với các lớp NSExpresion và NSComparisonPredicate? Với câu trả lời của bạn, tôi quyết định câu hỏi của tôi: http://stackoverflow.com/questions/2006927/whats-better-way-to-build-nspredicate-with-to-many-deep-relationships Cảm ơn – Victor

+1

Cảm ơn bạn rất nhiều vì câu trả lời này, thực sự hữu ích. – Maria

1

Khá tò mò làm thế nào để giải quyết điều này tôi thiết lập một dự án nhỏ và tạo ra bối cảnh bạn đang sử dụng.

NSDate *today = [NSDate date]; 
NSMutableArray *objects = [NSMutableArray array]; 

{ 
    NSArray *day = [NSArray arrayWithObjects:today, [today dateByAddingTimeInterval:20.0f], nil]; 
    NSDictionary *excludedDay = [NSDictionary dictionaryWithObject:day forKey:@"day"]; 
    NSDictionary *object = [NSDictionary dictionaryWithObject:excludedDay forKey:@"excludedDay"]; 

    [objects addObject:object]; 
} 

{ 
    NSArray *day = [NSArray arrayWithObjects:[today dateByAddingTimeInterval:20.0f], nil]; 
    NSDictionary *excludedDay = [NSDictionary dictionaryWithObject:day forKey:@"day"]; 
    NSDictionary *object = [NSDictionary dictionaryWithObject:excludedDay forKey:@"excludedDay"]; 

    [objects addObject:object]; 
} 


NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NONE excludedDay.day == %@", today]; 
NSArray *filtered = [objects filteredArrayUsingPredicate:predicate]; 

NSLog(@"%@", filtered); 

này cung cấp cho các đối tượng khi:

  1. Mảng ngày là có sản phẩm nào
  2. Mảng ngày không chứa 'hôm nay ngày

này không cung cấp cho các đối tượng khi:

  1. Mảng ngày chứa các 'hôm nay
    • Nó không quan trọng bao nhiêu đối tượng trong mảng ngày là
+1

Thật không may, đây là một cài đặt hoàn toàn khác: ngữ cảnh của tôi dựa trên Dữ liệu cốt lõi và SDK iPhone 3.0 hoặc 3.1. Dường như khung dữ liệu cốt lõi không xử lý các vị từ chính xác khi theo một mối quan hệ nhiều. Tôi đã đệ trình một lỗi và các kỹ sư của Apple đang làm việc trên nó, nhưng vẫn không có câu trả lời từ họ. –

+1

Sau đó, nó thực sự là một vấn đề chuyển tiếp dữ liệu lõi, vì sử dụng cùng một biến vị ngữ nhưng không có dữ liệu lõi nó hoạt động đúng cách (như đã thấy trong nỗ lực của tôi để bắt chước cùng một ngữ cảnh (liên quan đến Foumdation) – Joost

+1

đã giúp tôi trong năm 2011 :) +1 –

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