coredata sqlite искажена БД - PullRequest
       1

coredata sqlite искажена БД

1 голос
/ 02 сентября 2010

У меня проблемы с моей базой данных coredata sqlite, в которой размещена книжная БД.После сбоя пользователь сталкивается с проблемой, состоящей в том, что данные больше не отображаются должным образом в его / ее табличном представлении.

Это связано с тем, что метод executeFetch возвращает ошибку:

[NSFetchedResultsController deleteCacheWithName:nil];
if (![[self fetchedResultsController] performFetch:&error]) { 
        //NSArray *array = [[self fetchedResultsController] fetchedObjects];
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
#ifdef DEBUG
        abort();
#endif
    }

, что приводит к появлению этого сообщения об ошибке:

Неразрешенная ошибка Error Domain = NSCocoaErrorDomain Code = 134060 "Операция не может быть завершена. (Ошибка Какао 134060.)" UserInfo = 0x1dff80 {reason =Выбранный объект с индексом 312 имеет имя секции не по порядку 'Z.Объекты должны быть отсортированы по имени раздела '}, {reason = "Выбранный объект по индексу 312 имеет не по порядку имя раздела' Z. Объекты должны быть отсортированы по имени раздела '";

Когда у меня естьзагляните в файл sqlite с помощью «SQLite Database Browser 2.0 b1», атрибуты каждой сущности выглядят нормально.

Когда я удаляю некоторые из упомянутых сущностей, все снова работает нормально.

Iхотел бы узнать, как я могу выяснить, что именно не так с упомянутыми объектами, и исправить это, чтобы пользователь мог снова использовать свои данные.Конечно, я хочу исправить ошибку, которая также приводит к искажению БД, но это не в фокусе в этом посте.

Есть ли у кого-нибудь какие-либо подсказки, где я мог бы посмотреть или что могло быть искажено в моемБД или что такое "имя секции не в порядке"?

Это код для моего fetchedResultsController:

- (NSFetchedResultsController *)fetchedResultsController {

    if (fetchedResultsController != nil) {
        return fetchedResultsController;
    }


    // Create the fetch request for the entity.
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    // Edit the entity name as appropriate.
    NSEntityDescription *entity;
    entity = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:[[GlobalData sharedInstance] managedObjectContext]];
    [fetchRequest setEntity:entity];

    // Set the batch size to a suitable number.
    [fetchRequest setFetchBatchSize:10];

    //set searchPredicate
    NSPredicate *predicate = nil;
    if (self.bibList != nil) {
        predicate = [NSPredicate predicateWithFormat:@"ANY BibLists.name LIKE %@", self.bibList.name];      
    }

    if (predicate) {
        [fetchRequest setPredicate:predicate];
    }


    // Edit the sort key as appropriate.
    NSSortDescriptor *sortDescriptor;   
    NSString *sortDescriptorString = nil;       
    sortDescriptorString = @"title";
    sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortDescriptorString ascending:YES]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];   
    [fetchRequest setSortDescriptors:sortDescriptors];

    NSString *sectionNameKeyPath = nil;
    sectionNameKeyPath = @"uppercaseFirstLetterOfTitle";

    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    NSFetchedResultsController *aFetchedResultsController;
    aFetchedResultsController = [[NSFetchedResultsController alloc] 
                             initWithFetchRequest:fetchRequest 
                             managedObjectContext:[[GlobalData sharedInstance] managedObjectContext] 
                             sectionNameKeyPath:sectionNameKeyPath 
                             cacheName:@"Bibliography"];

    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    [aFetchedResultsController release];
    [fetchRequest release];
    [sortDescriptor release];
    [sortDescriptors release];

    return fetchedResultsController;
}    

Спасибо, b00tsy

Ответы [ 2 ]

1 голос
/ 05 сентября 2010

Я думаю, что здесь происходит то, что ваше хранилище SQL повреждено и / или у вас необычный sectionNameKeyPath.

Схема Core Data ставит перед всеми именами столбцов SQL префикс Z, поэтому ошибка с именем 'Z указывает на испорченную таблицу SQL. Чтобы проверить это, выполните запрос выборки напрямую, а не с помощью контроллера полученных результатов, и посмотрите, сможете ли вы извлечь все объекты.

Если вы не можете, значит хранилище SQL повреждено. Скорее всего, какой-то компонент таблицы просто называется 'Z вместо чего-то вроде ZAttributeName. Вам придется редактировать SQL напрямую, но это сложно из-за пользовательской частной схемы. Смотрите этот пост , чтобы понять, что искать. Для этого нет никаких инструментов, потому что порча магазина настолько редка.

Если выборка работает, то проблема в том, что sectionNameKeyPath передается в контроллер полученных результатов. Прямо сейчас, похоже, у вас есть атрибут сущности с первой буквой атрибута заголовка. (Это избыточно, потому что по умолчанию FRC автоматически возвращает буквенные разделы на основе любого строкового атрибута.) Попробуйте изменить sectionNameKeyPath на просто имя атрибута title (наиболее вероятно, «title»). В любом случае, просто обойтись без атрибута uppercaseFirstLetterOfTitle.

1 голос
/ 05 сентября 2010

Следующее утверждение в документации намекает на ошибку.

Если этот путь ключа не совпадает с указанным дескриптором первой сортировки в fetchRequest, они должны генерировать те же относительные упорядочения.

Кажется, что элемент в индексе 312 находится не в правильном разделе при сортировке только по заголовку. Это может быть результатом того, что свойство title начинается не с буквы, а со строчной буквы, что при использовании лексической сортировки помещает его после раздела Z, но значение uppercaseFirstLetterOfTitle элемента не равно «Z». В качестве предложения попробуйте добавить дескриптор сортировки в uppercaseFirstLetterOfTitle в качестве первого дескриптора сортировки, затем добавьте дескриптор сортировки в title.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...