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.
Bạn có thể NSLog toàn bộ fetchedResultsController không? –
@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ỉ. –
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. –