Не удается найти файл momd: проблемы с основными данными
Aw geez! Я что-то прикрутил!
Я Core Data noob, работая над своим первым приложением 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? "Очистить" и "Очистить все цели" выделены серым цветом.
Я рад опубликовать соответствующий код из своего приложения, которое поможет пролить свет на эту проблему, но там нет кода, связанного с Core Data, который я не понимаю, поэтому я не уверен, какую часть сообщения! Любая помощь приветствуется.
Ответы
Ответ 1
Вот несколько рекомендаций:
-
Код, который вы отправили для получения файла .mom(d)
, не совсем рекомендуется. Вместо этого используйте mergedModelFromBundles
, как в
self.managedObjectContent= [NSManagedObjectModel mergedModelFromBundles:nil];
Он заботится о том, чтобы получить путь, выбрав/сменив правильный mom
или momd
, и инициализацию MOC на один шаг. Вы должны использовать это. Но обратите внимание, что вам нужно время от времени очищать процесс сборки, как обсуждалось в этом вопросе/ответе SO.
-
Это показывает, что, хотя обход через StackOverflow часто хорош, это не лучший подход, когда вы имеете дело с большой структурой, такой как CoreData.
Честно говоря, возьмите день и прочитайте документацию от начала до конца. Возможно, вы захотите внести код в код google и немедленно начать кодирование, но чтение документации позволяет значительно сократить время разработки в долгосрочной перспективе.
Кроме того, книга Marcus Zarra CoreData (см. здесь) мне очень помогла. Это может стоить дорого, но это стоило того.
-
В другой теме я не считаю хорошей стратегией поместить предварительно подготовленный файл sqlite в каталог симулятора (внутри ~/Library/Application Support/iPhone Simulator/
) даже для целей разработки... потому что он не работать на реальном устройстве. Если вам нужно это сделать, поместите файл sqlite в качестве ресурса приложения и скопируйте его во время запуска на Documents
или Caches
и затем используйте это.
Ответ 2
Если элементы меню "Чистые цели" серые, возможно, что приложение работает.
То, как вы получаете путь к mom/momd, похоже на то, что вы пытались интегрировать CoreData после факта (вместо того, чтобы выбирать его, когда вы создали проект). У меня были те же проблемы, которые вы, вероятно, делаете. Код по умолчанию, который ищет momd, предполагает, что он существует, и вы также должны иметь возможность добавить версию своей модели данных в проект.
Для этого выберите файл xcdatamodel, а в меню "Дизайн" выберите "Модель данных" > "Добавить версию модели". Затем у вас будет CoreData.xcdatamodeld с поддеревом, содержащим Coredata.xcdatamodel и новой версией. Вы можете просто удалить дополнительную версию, и вам понадобится иерархия. Если вы создадите и посмотрите в комплекте приложений, вы увидите каталог CoreData.momd с мамой внутри.
Эти шаги не включены ни в один из учебных пособий CoreData, которые я нашел до сих пор. Я надеюсь, что это будет полезно!
Ответ 3
Практический ответ:
Вы можете попробовать следующий код, если у вас проблемы с пути. Вы также захотите проверить, что ваш файл xcdatamodel включен как ресурс для вашей цели.
[[NSBundle bundleForClass:[self class]] pathForResource:@"CoreData" ofType:@"momd"]
Лучший ответ: существует различие между файлом momd, который представляет ваш NSManagedObjectModel, и sqlite файл, который используется вашим объектом NSPersistentStore. Лучший подход к работе с CoreData - позволить SDK обрабатывать все взаимодействия с sqlite. Единственное, что вам нужно настроить в отношении sqlite, - это сообщить вашему NSPсервисмусту, где нужно хранить ваш файл sqlite. Управляемые объекты, которые вы определяете в модели управляемого объекта, будут обрабатывать все вставки и обновления данных для вас.
Если вы не знакомы с объектами, на которые я ссылался, ознакомьтесь с документами apple для очень полезного обзора. Вы определенно захотите потратить время, чтобы схватить полный стек CoreData, так как время инвестиций окупится гораздо меньше головных болей, если вы будете работать с Core Data так, как ожидает Apple. Это более абстрактный дизайн, чем привыкли многие веб-разработчики, но попытка обойти эту абстракцию, работая непосредственно с SQLite, создает свой собственный набор сложностей.
http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdBasics.html#//apple_ref/doc/uid/TP40001650-TP1
Ответ 4
Мне показалось очень полезным взглянуть на мой исполняемый файл в имитаторе "образ диска".
Если вы направляетесь в ~/Library/Application Support/iPhone Simulator//Applications, вы можете видеть приложения на телефоне. Выясните, какой из них принадлежит вам (используйте find, или посмотрите на дату), а затем перейдите в свой target.app и найдите файл .momd.
В моем случае мое имя мамы отличалось от моего имени файла .xcdatamodeld, поэтому данные ядра не могли загрузить его. Как только я исправил имя в AppDelegate, все начало работать правильно.
Обратите внимание, что мад файл "на самом деле" является каталогом (например, установкой .app).
-
С точки зрения добавления кода для инициализации основных данных; Я тоже это сделал. Я создал новый пустой проект с включенными основными данными и скопировал все шаги инициализации для основных данных в файле AppDelegate. Там целая куча вещей, связанных с инициализацией всего стека, поэтому, если этого нет, вам нужно поместить его туда.
Ответ 5
Если вы добавили версию в свою модель, измените ее .mom на .momd
NSString *path = [[NSBundle mainBundle] pathForResource:@"CoreData" ofType:@"momd"];
if (!path) {
path = [[NSBundle mainBundle] pathForResource:@"CoreData" ofType:@"momd"];