2013-08-20 28 views
5

Tôi nhận được thông báo lỗi sau:Bizarre vấn đề - "Đối tượng lấy tại chỉ số x có một ra khỏi trật tự tên phần"

CoreData: error: (NSFetchedResultsController) The fetched object at index 5 has an out of order section name 'James. Objects must be sorted by section name' 
Unresolved search error Error Domain=NSCocoaErrorDomain Code=134060 "The operation couldn’t be completed. (Cocoa error 134060.)" UserInfo=0xaa07530 {reason=The fetched object at index 5 has an out of order section name 'James. Objects must be sorted by section name'}, { 
    reason = "The fetched object at index 5 has an out of order section name 'James. Objects must be sorted by section name'"; 
} 

Tôi đã trải qua không biết bao nhiêu câu trả lời về SO mà chủ yếu là kết thúc trỏ đến sử dụng caseInsensitive so sánh như câu trả lời tuy nhiên như bạn thấy bên dưới tôi lấy yêu cầu đã được thiết lập để làm điều này:

<NSFetchRequest: 0xc082bd0> (entity: InviteeModel; predicate: (eventId == 148 AND typeOf != "InviteeTypeOfServerContact"); sortDescriptors: ((
    "(lastName, ascending, caseInsensitiveCompare:)", 
    "(firstName, ascending, caseInsensitiveCompare:)" 
)); batch size: 1000; type: NSManagedObjectResultType;) 

tôi dường như đã thu hẹp nó xuống để trường hợp tôi có hai khách mời với cùng tên cuối cùng (tức là HENRY JAMES và Henry James) sau đó tôi nhận được lỗi ở trên nói rằng James đã hết trật tự. Nếu tôi đổi cả hai họ thành James hoặc JAMES thì nó sẽ hoạt động?!?!?

Dưới đây là đoạn code mà tạo ra các yêu cầu lấy:

NSFetchRequest *fetchRequest = [self buildFetchRequest]; 

// We have to reset the fetched results controller if the sort changes. 
// Because otherwise the scrolling index will be inaccurate. 
if (self.fetchedResultsController) { 
    if (![self.fetchedResultsController.sectionNameKeyPath isEqualToString:self.sortBy]) { 
     self.fetchedResultsController = nil; 
    } 
} 


if (!self.fetchedResultsController) { 

    NSManagedObjectContext *context = self.event.managedObjectContext; 

    NSString *sectionNameKeyPath = nil; 
    if (self.sortBy == DefaultSortBy) { 

     sectionNameKeyPath = @"sectionChar"; 
    } 
    else { 

     sectionNameKeyPath = self.sortBy; 
     if ([self.sortBy isEqualToString:@"rsvpState"] || [self.sortBy isEqualToString:@"checkedIn"]) { 
      sectionNameKeyPath = @"lastName"; 
     } 
    } 

    NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                           managedObjectContext:context 
                           sectionNameKeyPath:sectionNameKeyPath 
                              cacheName:nil]; 
    fetchedResultsController.delegate = self; 
    self.fetchedResultsController = fetchedResultsController; 

và đây là một mảnh từ buildFetchRequest có thêm các sortDescriptors:

 NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:self.sortBy 
                     ascending:self.shouldSortAscending 
                     selector:@selector(caseInsensitiveCompare:)]; 

     // Add the default sorts (last, first). 
     NSSortDescriptor *lastSort = nil; 
     NSSortDescriptor *firstSort = nil; 
     if (![self.sortBy isEqualToString:@"lastName"]) { 
      lastSort = [NSSortDescriptor sortDescriptorWithKey:@"lastName" 
                ascending:YES 
                 selector:@selector(caseInsensitiveCompare:)]; 
     } 
     if (![self.sortBy isEqualToString:@"firstName"]) { 
      firstSort = [NSSortDescriptor sortDescriptorWithKey:@"firstName" 
                 ascending:YES 
                 selector:@selector(caseInsensitiveCompare:)]; 
     } 

     NSArray *sorts = nil; 

     if (lastSort && firstSort) { 
      sorts = [[NSArray alloc] initWithObjects:sortDescriptor, lastSort, firstSort, nil]; 
     } 
     else if (lastSort) { 
      sorts = [[NSArray alloc] initWithObjects:sortDescriptor, lastSort, nil]; 
     } 
     else { 
      sorts = [[NSArray alloc] initWithObjects:sortDescriptor, firstSort, nil]; 
     } 

     [fetchRequest setSortDescriptors:sorts]; 

Bất kỳ ý tưởng, điều này được lái xe cho tôi điên.

+0

Bạn có thể NSLog toàn bộ fetchedResultsController không? –

+0

@MartinR, thx để trợ giúp. Có bất cứ điều gì cụ thể bạn đang tìm kiếm trong frc mà tôi có thể in ra? Một đối tượng lớn của nó và nslogging nó chỉ cho tôi địa chỉ. –

+0

Câu hỏi chính của tôi là nếu sectionNameKeyPath và bộ mô tả sắp xếp đầu tiên luôn sử dụng cùng một khóa. Nó không phải là hiển nhiên đối với tôi từ mã của bạn. –

Trả lời

2

Bạn đang đặt đường dẫn khóa tên phần bộ điều khiển kết quả được tìm nạp khác với khóa trình mô tả sắp xếp đầu tiên.

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] 
      initWithKey:self.sortBy 
      ascending:self.shouldSortAscending 
      selector:@selector(caseInsensitiveCompare:)]; 

Khoá là self.sortBy.

if ([self.sortBy isEqualToString:@"rsvpState"] || 
    [self.sortBy isEqualToString:@"checkedIn"]) { 
     sectionNameKeyPath = @"lastName"; 
} 

Key là khôngself.sortBy.

Điều này sẽ dẫn đến lỗi bạn đang gặp phải.

+0

Hi @Mundi, tôi đã in ra giá trị của self.sortBy và FRC sectionNameKeyPath và nó luôn luôn là "lastName" ngay cả khi lỗi xuất hiện để Im không chắc chắn nếu đó là nó? –

+0

Cũng in ra đường dẫn chính của bộ mô tả sắp xếp đầu tiên của bạn và so sánh. – Mundi

0

Vâng, Câu hỏi chính là thuộc tính nào đang xác định sectionNameKeyPath và nếu thuộc tính đó đã được sử dụng làm bộ mô tả sắp xếp đầu tiên trong mảng mô tả sắp xếp.

Tôi đoán đó là điều đầu tiên để kiểm tra xem bạn có gặp sự cố như thế này không.

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