Не удается найти файл momd: проблемы с основными данными
О Боже! Я что-то напортачил!
Я - нуб Core Data, работаю над своим первым приложением для iOS. После большого переполнения стека я использую этот код:
NSString *path = [[NSBundle mainBundle] pathForResource:@"CoreData" ofType:@"momd"];
if (!path) {
path = [[NSBundle mainBundle] pathForResource:@"CoreData" ofType:@"mom"];
}
NSAssert(path != nil, @"Unable to find Resource in main bundle");
CoreData - это название моего приложения.
Я попытался ввести исходные данные в приложение, найдя путь к файлу sqlite в моем симуляторе iPhone, а затем вставив и вставив в этот файл sqlite. Но в какой-то момент я переместил sqlite (думая, что он создаст новую копию), удалил приложение из симулятора, и файл sqlite пропал. Я не уверен, пропускаю ли я какую-то часть процесса (это было несколько часов назад), но в результате все облажается.
Как восстановить файл sqlite / momd? "Очистить" и "Очистить все цели" выделены серым цветом.
Я рад опубликовать соответствующий код из моего приложения, который поможет пролить свет на эту проблему, но есть тонны кода, относящиеся к базовым данным, которые я не понимаю, поэтому я не уверен, какую часть публиковать! Любая помощь с благодарностью.
5 ответов
Вот несколько рекомендаций:
Код, который вы разместили, чтобы получить
.mom(d)
файл не совсем рекомендуемый способ. использованиеmergedModelFromBundles
вместо этого, как вself.managedObjectContent= [NSManagedObjectModel mergedModelFromBundles:nil];
Он заботится о поиске пути, выборе / объединении правильных
mom
или жеmomd
и инициализация MOC за один шаг. Вы должны использовать это. Но обратите внимание, что вам нужно время от времени очищать процесс сборки, как обсуждалось в этом вопросе / ответе.Это показывает, что, хотя обход через Stackru часто хорош, это не лучший подход, когда вы имеете дело с большой платформой, такой как CoreData.
Честно говоря, найдите день и прочитайте документацию от начала до конца. Возможно, вы захотите погуглить кусочки кода и сразу же приступить к написанию кода, но чтение документации определенно значительно экономит время разработки в долгосрочной перспективе.
Кроме того, книга CoreData Маркуса Зарры (см. Здесь) мне очень помогла. Это может выглядеть дорого, но это того стоило.
По другой теме, я не считаю хорошей стратегией помещать предварительно подготовленный файл sqlite в каталог симулятора (внутри
~/Library/Application Support/iPhone Simulator/
) даже для целей разработки... потому что это не работает на реальном устройстве. Если вам нужно сделать это, поместите файл sqlite в качестве ресурса приложения и скопируйте его во время запуска вDocuments
или жеCaches
и использовать это потом.
Если пункты меню "Чистые цели" серые, возможно, приложение запущено.
То, как вы получаете путь к маме / маме, выглядит так, будто вы пытались интегрировать CoreData после факта (вместо того, чтобы включить его при создании проекта). У меня были те же проблемы, что и у вас. Код по умолчанию, который ищет momd, предполагает, что он существует, и вы также сможете это сделать, если добавите в проект версию своей модели данных.
Для этого выберите файл xcdatamodel и в меню "Дизайн" выберите "Модель данных"> "Добавить версию модели". Затем у вас будет CoreData.xcdatamodeld с поддеревом, содержащим Coredata.xcdatamodel и новую версию. Вы можете просто удалить дополнительную версию, и у вас будет нужная иерархия. Если вы соберетесь и загляните в комплект приложений, вы увидите каталог CoreData.momd с мамой внутри.
Эти шаги не включены ни в одно из учебных пособий по CoreData, которые я нашел до сих пор. Я надеюсь, что это полезно!
Практический ответ: вы можете попробовать следующий код, если у вас есть проблемы с путями. Вы также захотите убедиться, что ваш файл xcdatamodel включен в качестве ресурса для вашей цели.
[[NSBundle bundleForClass:[self class]] pathForResource:@"CoreData" ofType:@"momd"]
Лучший ответ: существует различие между файлом momd, который представляет ваш NSManagedObjectModel, и файлом sqlite, который используется вашим объектом NSPersistentStore. Лучший подход к работе с CoreData - позволить SDK обрабатывать все взаимодействия с sqlite. Единственное, что вам нужно настроить в отношении sqlite, это сообщить вашему NSPersistantStore, где хранить ваш файл sqlite. Управляемые объекты, которые вы определяете в своей модели управляемых объектов, будут обрабатывать все вставки данных и обновления для вас.
Если вы не знакомы с объектами, на которые я ссылался, обратитесь к документации Apple, чтобы получить очень полезный обзор. Вам определенно захочется потратить время на то, чтобы охватить весь стек CoreData, поскольку затраты времени будут окупаться гораздо меньше, если вы будете работать с Core Data так, как ожидает Apple. Это более абстрактный дизайн, чем привыкли многие веб-разработчики, но попытка обойти эту абстракцию, работая напрямую с SQLite, создает свой собственный набор сложности.
Мне показалось очень ценным пойти посмотреть на мой исполняемый файл в симуляторе "образ диска".
Если вы зайдете в ~/ Библиотека / Поддержка приложений /iPhone Simulator// Приложения, вы сможете увидеть приложения на телефоне. Выясните, какой из них ваш (используйте поиск или посмотрите на дату), а затем найдите в своем target.app и найдите файл.momd.
В моем случае имя momd отличалось от имени моего файла.xcdatamodeld, поэтому данные ядра не могли его загрузить. Как только я исправил имя в AppDelegate, все стало работать правильно.
Обратите внимание, что momd-файл, по-видимому, на самом деле является каталогом (например, установка.app).
-
С точки зрения добавления кода для инициализации основных данных; Я тоже это сделал. Я создал новый пустой проект с включенными основными данными и скопировал все этапы инициализации основных данных в файле AppDelegate. Существует целый ряд вещей, связанных с инициализацией всего стека, поэтому, если его нет, вам нужно поместить его туда.
Если вы добавили версию к своей модели, измените.mom на.momd
NSString *path = [[NSBundle mainBundle] pathForResource:@"CoreData" ofType:@"momd"];
if (!path) {
path = [[NSBundle mainBundle] pathForResource:@"CoreData" ofType:@"momd"];