Основные данные, генерирующие пустую базу данных SQLite - PullRequest
3 голосов
/ 18 июля 2011

У меня есть база данных, которую я использовал с моим проектом для нескольких сборок. Сначала я построил базу данных с основными данными, извлек результирующий файл SQLite, заполнил его данными, а затем добавил результирующий файл SQLite в свой проект. Это работало в течение нескольких итераций использования облегченной миграции для внесения изменений в мою структуру базы данных. Однако при моей последней попытке данные ядра неожиданно начали жаловаться на несоответствие хэша.

После того, как я не смог решить проблему, я решил просто удалить файл SQLite из моего проекта, очистить сборку и удалить данные приложения (чтобы основные данные инициализировали для меня свежий файл SQLite). Теперь данные ядра даже не инициализируют базу данных, и полученный файл SQLite пуст (не имеет таблиц). Когда я пытаюсь запустить мой код, он вылетает с executeFetchRequest:error: A fetch request must have an entity.

Есть идеи, где я мог ошибиться?

1 Ответ

2 голосов
/ 18 июля 2011

Непосредственное заполнение файла хранилища SQLite не поддерживается.Apple не документирует схему магазина sqlite и изменяет ее без предупреждения или уведомления.Если у вас есть прямой доступ к файлу хранилища sqlite за пределами Core Data, вы можете ожидать сбоя хранилища в какой-то момент по мере обновления ОС и SDK.

Ошибка A fetch request must have an entity вызвана назначением значения nil запросу на выборку, обычно это вызвано следующей строкой:

NSEntityDescription *alphaEntity=[NSEntityDescription entityForName:@"Alpha" inManagedObjectContext:aManagedObjectContext];

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

Наиболее распространенной причиной является простая опечатка, например, указание @ "Alpha", когда фактическое имя сущности равно @ "Aleph", но это также может быть вызвано ошибкой загрузки правильного или любого управляемого объекта.модель.

Когда вы используете nil-сущность в запросе на выборку:

[aFetchRequest setEntity:alphaEntity];

... вы получаете ошибку.

Вы можете получить доступ к модели напрямую из контекста с помощью:

[[aMangedObjectContext persistentStoreCoordinator] managedObjectModel]

В свою очередь NSManagedObjectModel предоставляет множество методовчто вы можете использовать для запроса активной модели, например, entitiesByName вернет словарь, ключами которого являются имена всех имен сущностей, известных модели.

Прямой доступ к модели может сказать вам, что происходит.Либо у вас есть опечатка, либо вы по какой-то причине не загрузили модель.

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