2011-08-18 27 views
9

Tôi gặp sự cố khi thay đổi thuộc tính BOOL của NSManagedObject.Dữ liệu lõi NSInvalidArgumentException Error

Mã để lưu các đối tượng là:

self.detailItem.bookmark = [NSNumber numberWithBool:YES]; 
NSError *error = nil; 
if (! [self.detailItem.managedObjectContext save:&error]) 
{ 
    // Handle the error. 
} 
NSLog(@"%@", error); 

Và các lỗi:

Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. The left hand side for an ALL or ANY operator must be either an NSArray or an NSSet. with userInfo (null) 
2011-08-18 15:41:32.866 Codes[5260:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The left hand side for an ALL or ANY operator must be either an NSArray or an NSSet.' 
+0

Bạn cần thêm nhiều mã hơn - chi tiết của bạn trông như thế nào; nó chỉ là một NSManagedObject? – deanWombourne

+0

Vâng, 'detailItem' chỉ là một NSManagedObject với thuộc tính BOOL được gọi là 'bookmark'. –

Trả lời

7

CẢNH BÁO: Câu trả lời này được dựa trên một đoán tôi đã thực hiện dựa trên các thông báo lỗi; nó có thể là 100% sai!


Lỗi có vẻ như được định dạng sai NSPredicate. Bạn có thể có một cái gì đó giống như

NSString *name = @"Bob"; 
[NSPredicate predictaeWithFormat:@"ANY %K IN %@", @"name", name]; 

Đó có vẻ như nó có thể tìm thấy bất cứ điều gì nơi name = 'Bob' nhưng nó sẽ không, nó sẽ ném một ngoại lệ :(

Nếu bạn đang sử dụng 'trong' bạn cần phải vượt qua .. một NSSet hoặc NSArray tức

NSArray *names = [NSArray arrayWithObjects:@"Alice", @"Bob", nil]; 
[NSPredicate predictaeWithFormat:@"ANY %K IN %@", @"name", names]; 

này sẽ tìm thấy bất cứ điều gì với tên 'Bob' hoặc 'Alice'

Nếu bạn chỉ muốn tìm kiếm cho 'Bob', chỉ cần làm điều này:

NSString *name = @"Bob"; 
[NSPredicate predictaeWithFormat:@"%K == %@", @"name", name]; 
+0

Không có biến vị ngữ nào trong VC này. Tuy nhiên tôi có VC riêng biệt có vị từ này '[NSPredicate predicateWithFormat: @" ANY bookmark == YES "];' Có gì sai ở đó không? –

+1

Lỗi này ngụ ý rằng đó là một số đối tượng khác quan tâm đến những thay đổi đối với đối tượng được quản lý của bạn gây ra ngoại lệ, vì vậy có thể đó là vị từ đó.Hãy thử nó mà không có 'BẤT CỨ' và xem những gì sẽ xảy ra? – deanWombourne

+0

Đã cố gắng nhưng vẫn gặp sự cố. Đối với VC, chúng tôi đang làm việc với, đó là tất cả các mã tôi có liên quan đến đối tượng, đối tượng được đẩy từ chế độ xem gốc. Tôi không có bất kỳ mã MOC nào vì đối tượng sẽ tự kéo chính MOC. –

3

Tôi nghĩ deanWornbourne đã viết câu trả lời đúng, nhưng không rõ ràng với tôi vì vậy tôi sẽ trả lời câu trả lời và thông tin chi tiết của mình và cung cấp giải thích thêm.

ProgramGuy đã nhận được lỗi ứng dụng nghiêm trọng vì vị từ của anh ấy sai. Lý do tại sao ANY bookmark == YES sai là "BẤT K" "chỉ được sử dụng khi bạn có mối quan hệ một-nhiều trong mô hình của mình. Khi bạn có mối quan hệ một-một, bạn nên sử dụng bookmark == YES.

'Lỗi ứng dụng nghiêm trọng' có vẻ hơi ngớ ngẩn và gây ra nhiều báo động hơn mức cần thiết. Tuy nhiên, nó cung cấp cho bạn một đầu mối khá tốt cho lỗi. Nó nói rằng có một 'lỗi trong một người quan sát ..'. Điều đó có nghĩa là bạn có một số đối tượng 'NSFetchedResults' hoặc 'NSFetchedResultsController' (vì chúng ta đang nói về số NSManagedObjectContextObjectChangedNotification). Ngoài ra, thông báo lỗi cho biết left hand side for an ALL or ANY operator must be either an NSArray ... Đây là gợi ý rằng phải có mối quan hệ một-nhiều.

Hy vọng điều đó sẽ hữu ích.

0

Chỉ cần một FYI. Câu trả lời của deanWombourne đúng 100% trong trường hợp của tôi.

NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyTeamSchedule" inManagedObjectContext:[[MyTeamStore sharedStore] context]]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY myteam.teamname == %@", myTeamName]; 

Sau khi xóa bất kỳ vấn đề nào được giải quyết. Cảm ơn chúa cho dean! Chỉ cần lưu tôi từ nhiều giờ khắc phục sự cố và nhức đầu.

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