2010-10-14 46 views
18

Lõi tôi nhận được lỗi sau khi cố gắng để thêm một kỷ lục:nghiêm trọng Lỗi ứng dụng trong dữ liệu với fetchedResultsContainer

nghiêm trọng lỗi ứng dụng. Ngoại lệ đã bị phát hiện trong quá trình xử lý Dữ liệu chính . Đây thường là lỗi trong một người quan sát của NSManagedObjectContextObjectsDidChangeNotification. Chỉ mục 0 không hợp lệ với userInfo (null)

Và đó là nó. Tôi đặt breakpoint vào tất cả các phương thức delegate fetchedResultsContainer mà tôi đã thực hiện, nhưng không có gì phá vỡ.

tôi theo dõi nó xuống:

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"titleFirstLetter" cacheName:@"Root"]; 

"sectionNameKeyPath" là vấn đề. "titleFirstLetter" là thuộc tính tạm thời mà tôi đã tạo một getter cho lớp con NSManagedObject của mình.

Đây là getter:

-(NSString *)titleFirstLetter 
{ 
    [self willAccessValueForKey:@"titleFirstLetter"]; 
    NSString *aString = [[self valueForKey:@"title"] uppercaseString]; 

    NSString *stringToReturn = [aString substringWithRange:[aString rangeOfComposedCharacterSequenceAtIndex:0]]; 

    [self didAccessValueForKey:@"titleFirstLetter"]; 
    return stringToReturn; 
} 

Khi tôi thay đổi sectionNameKeyPath để nil, nó hoạt động, nhưng rõ ràng không phải là những gì tôi muốn. Nó cũng hoạt động khi tôi có một tiêu đề đã được điền vào cho mô hình của tôi, do đó titleFirstLetter không trả về nil, mặc dù điều đó dường như không hoàn toàn là vấn đề. Nếu tôi làm cho chuỗi một cái gì đó tùy ý nếu nó là nil, nó vẫn bị treo.

Có ý tưởng gì ở đây không?

CẬP NHẬT: Nếu tôi sử dụng tiêu đề trong phầnNameKeyPath thay vì thuộc tính tạm thời, nó không bị lỗi, nhưng rõ ràng sẽ đặt mọi mục vào phần riêng của nó. Vì vậy, nó liên quan đến bất động sản thoáng qua ...

UPDATE2: Một số cuộc tấn công sơ bộ bằng cách sử dụng tài sản liên tục thay vì tạm thời, và không có thay đổi nào khác, có vẻ hoạt động tốt, vì vậy đây có vẻ là một lỗi. Tôi có một báo cáo lỗi mở: # 8553064

CẬP NHẬT 3: Vâng, hãy cào. Sử dụng thuộc tính liên tục không tạo ra bất kỳ sự khác biệt nào. Bây giờ tôi hơi rên rỉ.

Cảm ơn!

Trả lời

12

Vâng, đây có thể là lỗi một phần (hoặc hoàn toàn) của người dùng. Vấn đề là, trong quan điểm mà tôi thêm một mục mới, tôi đã đặt [self.tableView reloadData] bên trong phương thức viewWillAppear. Nhận xét rằng đã không cập nhật các ô bảng, nhưng ngăn chặn sự cố.

Sau đó, tôi đã tiếp tục và gửi reloadRowsAtIndexPaths:withRowAnimation: đến chế độ xem bảng để tải lại thủ công một số ô cần thiết.

Tôi rất vui vì điều đó đã kết thúc!

+0

Lưu thịt xông khói của tôi! Cảm ơn! Bạn đã thêm reloadRowsAtIndexPaths vào đâu: withRowAnimation :? –

+0

rất cảm ơn. vấn đề này làm phiền tôi trong thời gian dài. – derjohng

2

Hành vi mặc định của bộ điều khiển kết quả tìm nạp là tạo một phần cho mỗi chữ cái đầu tiên của sectionNameKeyPath. Bạn không nên nhận một phần cho mỗi mục trừ khi mọi mục bắt đầu bằng một chữ cái khác.

Nếu bạn muốn tùy chỉnh hành vi tên phần, phân lớp NSFetchedResultsController và ghi đè sectionIndexTitleForSectionName:sectionIndexTitles. Xem tài liệu NSFetchedResultsController để biết chi tiết.

+0

Sau đó, tôi đang làm gì sai ở đây? http://assets.zerodeviation.net/sections.png Đây là với tiêu đề là sectionNameKeyPath. – Christoph

+0

Để thêm vào điều này, các tài liệu nói rằng __IndexTitle__ theo mặc định là chữ cái đầu tiên của vốn. Và đó là sự thật. Nhưng tôi đang nói về các tiêu đề phần. – Christoph

+0

Chỉ mụcTiêu đề là tiêu đề phần. Xem cách tên danh sách ứng dụng liên hệ. Nó sử dụng phương pháp được xây dựng chính xác này. Tôi không biết tại sao bạn lại gặp phải vấn đề này. Nhiều khả năng bạn có nơi nào đó đã vượt qua các thuộc tính. – TechZen

1

Tôi đã phát hiện ra một cách khác để đến cùng một ngoại lệ bí ẩn này. Thuộc tính tạm thời của tôi - giống như của bạn, để trích xuất chữ cái đầu tiên - không được bảo vệ dựa vào chuỗi có độ dài 0 (@ ""). Nỗ lực để có được nhân vật đầu tiên của nó đã ném một ngoại lệ và dẫn đến lỗi này dữ liệu cốt lõi (và không phải là ngoại lệ bạn sẽ mong đợi để xem).

2

Tôi nghĩ đây là vấn đề của tôi. Tôi đã nhận được thông điệp cảnh báo tương tự, nhưng giải pháp của tôi là VERY khác nhau.

Bạn có thể gặp phải lỗi này nếu bạn chưa triển khai đúng tất cả các phương thức ủy quyền NSFetchedResultsController. Tôi luôn luôn sao chép và dán 4 phương pháp từ Apple để biết cách triển khai NSFetchedResultsController.

Đáng tiếc là tôi đã bỏ lỡ một trong những:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { 
    [self.tableView beginUpdates]; 
} 

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    [self.tableView endUpdates]; 
} 

chắc chắn bạn đã GOT EM, nếu không bạn sẽ rút ra khỏi mái tóc của bạn như tôi.

+0

Tôi sẽ theo dõi những người đó, cảm ơn! – Christoph

+0

Đây là một giải pháp rất đơn giản cho một vấn đề chung. Trong khi tất cả các câu trả lời khác tôi chắc chắn cũng đúng, sai lầm tinh tế này cũng có thể tạo ra cùng một lỗi. Đáng chú ý. –

0

quan trọng

NSFetchedResultsController * consultMessageFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[[[WYCoreDataStorage shareStore] coreDataHelper] mainContext] sectionNameKeyPath:nil cacheName:nil]; 

Nếu bạn đang sử dụng một bộ nhớ cache, bạn phải gọi deleteCacheWithName: trước khi thay đổi bất kỳ lấy yêu cầu, vị ngữ của nó, hoặc mô tả loại của nó. Bạn không được sử dụng lại cùng một bộ điều khiển kết quả đã tìm nạp cho nhiều truy vấn trừ khi bạn đặt bộ nhớ cacheName thành nil.

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