iOS: Какие ошибки могут быть вызваны NSPersistentStoreCoordinator addPersistentStoreWithType: конфигурация: URL: параметры: ошибка:

#ios #core-data

#iOS #core-data

Вопрос:

Я создаю приложение для iOS с использованием CoreData. Небольшое количество моих пользователей (примерно 1/1000) сообщают, что приложение выходит из строя вскоре после запуска. Я подозреваю, что координатору постоянного хранилища не удается добавить базу данных в качестве постоянного хранилища. Мне не удалось воспроизвести какие-либо ошибки при тестировании, и я не могу получить какую-либо информацию об отладке от своих пользователей. Кто-нибудь знает о каких-либо распространенных ошибках, которые генерирует этот метод?

 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    if (persistentStoreCoordinator_ != nil) return persistentStoreCoordinator_;

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"databasefile.sqlite"];

    NSError *error = nil;

    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];

    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:amp;error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return persistentStoreCoordinator_;
}
  

Ответ №1:

Вы можете посмотреть на ссылку на константы Core Data, но без каких-либо отладочных данных это не принесет вам большой пользы.

Единственное, что я мог бы проверить, это: (1) случайная запись или перезапись хранилища где-либо еще в коде, например, вы намереваетесь создать резервную копию файла, скопировав его, но вместо этого перезаписываете его частично. (2) Изменение разрешений для файла.

Я видел случаи обоих этих на macOS, но никогда на iOS. Хранилище находится в папке documents и имеет очень общее название, поэтому, возможно, в iOS 4.x вы могли бы скопировать файл поверх него.

Поскольку вы не сделали ничего особенного с постоянным хранилищем, я думаю, крайне маловероятно, что это является причиной сбоя. Если вы используете стандартный шаблонный код, вы говорите о чем-то, что тщательно протестировано и доработано. Я бы заподозрил ресурс определенного типа, например, изображение или аудиофайл, в пакете приложений, прежде чем я бы заподозрил магазин.

Комментарии:

1. Спасибо, @TechZen. Вы правы, проблема вовсе не в Core Data. Я, наконец, получил отчет о сбое от пользователя, и основной поток блокировался при разборе xml-документа. Ошибка новичка.

2. @Raider, у меня та же проблема, что и у вас: три сообщения об ошибках за два года, никаких сообщений о сбоях и вывод, что, должно быть, сбой при загрузке хранилища. Я потратил много часов на улучшение обработки ошибок при вызовах Core Data, но, возможно, я на неверном пути. Я не выполняю никакого синтаксического анализа xml, но я открываю магазин во время запуска приложения, поэтому возможно, что что-то еще блокирует для этих нескольких пользователей. Не могли бы вы предоставить более подробную информацию о вашем решении, пожалуйста? Кажется, это возможность для меня чему-то научиться 😉

Ответ №2:

Я думаю, вы добавили новый атрибут к сущностям, и именно поэтому old .sqlite не совпадает с new .

Решение :

Если вы получили сообщение об ошибке типа «Модель, используемая для открытия магазина, несовместима с той, которая использовалась для создания магазина». тогда просто удалите базу данных и создайте новую или удалите приложение и переустановите.

Если я ошибаюсь, пожалуйста, дайте мне знать.