2012-03-21 9 views
5

Tôi đã thiết lập mô hình sau đây trong Dữ liệu chính.SUBQUERY trong NSPredicate và NSInvalidArgumentException

Book has a to-many relationship, called toBookOrders, with OrderBook entity. The inverse is called toBook. 
Book has a BOOL value property called isSync. 

Tôi thiết lập sau NSPredicate.

NSEntityDescription* entityDescription = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:moc]; 
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"isSync == 0 AND SUBQUERY(toBookOrders, $x, $x.toBook == SELF)"]; 

Thông qua vị từ này, tôi chỉ cần lấy những cuốn sách chưa được đồng bộ hóa và đơn đặt hàng tương đối của chúng.

Đây là lỗi tôi nhận được.

Chấm dứt ứng dụng do ngoại lệ uncaught 'NSInvalidArgumentException', lý do: 'Không thể phân tích các chuỗi định dạng "isSync == 0 VÀ subquery (toBookOrders, $ x, $ x.toBook == TỰ)"

Bất kỳ ý tưởng nào? Cảm ơn bạn trước.

Trả lời

24

Dưới đây là mấu chốt của vấn đề của bạn:

@"isSync == 0 AND SUBQUERY(toBookOrders, $x, $x.toBook == SELF)" 

Nếu bạn chia mà thành hai subpredicates, như Scott gợi ý, bạn sẽ nhận được:

  • isSync == 0
  • SUBQUERY(toBookOrders, $x, $x.toBook == SELF)

Vấn đề là mỗi SUBQUERY không trả về đúng hay sai, như một vị từ phải. Nó trả về một bộ sưu tập (một mảng), và một mảng không giống như đúng hay sai. Do đó, khi bạn tạo vị từ, bạn sẽ gặp lỗi do định dạng không hợp lệ vì các công cụ sau ANDkhông phải là vị từ. Nó đơn giản chỉ là một biểu hiện.

Bạn đang lẽ muốn:

@"isSync == 0 AND SUBQUERY(toBookOrders, $x, $x.toBook == SELF)[email protected] > 0" 

Điều này sẽ cung cấp cho bạn một vị để tìm tất cả những cuốn sách mà isSync là sai và ít nhất một trong những Book OrderBooks là Book.

+0

Cảm ơn bạn rất nhiều Dave. Nice lời giải thích. Tôi có thể đạt được kết quả tương tự với BẤT K?? Cảm ơn bạn. –

+2

@Flex_Addicted yep, bạn có thể làm '... AND ANY toBookOrders.toBook == SELF' –

+0

Tôi yêu bạn <3 Rất hữu ích thực sự! –

-2

riêng các isSync == 0SUBQUERY vào riêng biệt NSPredicate s, thêm chúng vào một NSArray sau đó sử dụng [NSCompoundPredicate andPredicateWithSubpredicates:array] để có được chúng tham gia vào một duy nhất để vượt qua NSFetchSpecification của bạn.

+0

Cảm ơn bạn. Vấn đề vẫn còn đó. Có thể không sử dụng được * SELF * trong các truy vấn phụ. Cảm ơn bạn. –

+0

Đây là cách tôi đã sử dụng nó: '[NSPredicate predicateWithFormat: @" SUBQUERY (childItems, $ child, $ child.columnName IN% @). @ Count! = 0 ", arrayOfThingsToMatchOn]'. Tự nghĩ là ngầm, tôi nghĩ vậy. –

+0

-1 Điều này không khác với việc sử dụng 'AND' trong định dạng biến vị ngữ. –