Подтвердить что ты не робот

Не удается найти файл 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, который я не понимаю, поэтому я не уверен, какую часть сообщения! Любая помощь приветствуется.

4b9b3361

Ответ 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"];