Не удается найти файл momd: проблемы с основными данными - PullRequest
17 голосов
/ 27 декабря 2010

Боже мой!Я что-то напортачил!

Я - нуб 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 ]

44 голосов
/ 27 декабря 2010

Вот несколько рекомендаций:

  • Код, который вы отправили для получения файла .mom(d), не совсем рекомендуемый способ. Вместо этого используйте mergedModelFromBundles, как в

    self.managedObjectContent= [NSManagedObjectModel mergedModelFromBundles:nil];
    

    Он заботится о получении пути, выборе / объединении правильных mom или momd и инициализации MOC за один шаг. Вы должны использовать это. Но учтите, что вам нужно время от времени очищать процесс сборки, как обсуждено в этом SO вопросе / ответе .

  • Это показывает, что, хотя обход через StackOverflow часто хорош, это не лучший подход, когда вы имеете дело с большой структурой, такой как CoreData.

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

    Кроме того, книга CoreData Маркуса Зарры (см. здесь ) мне очень помогла. Это может выглядеть дорого, но оно того стоило.

  • По другой теме, я не считаю хорошей стратегией помещать предварительно приготовленный файл sqlite в каталог симулятора (внутри ~/Library/Application Support/iPhone Simulator/) даже для целей разработки ... потому что это не так работать на реальном устройстве. Если вам нужно сделать это, поместите файл sqlite в качестве ресурса приложения и скопируйте его во время запуска в Documents или Caches и используйте его впоследствии.

18 голосов
/ 25 января 2011

Если пункты меню «Чистые цели» отображаются серым цветом, возможно, у вас запущено приложение.

Способ, которым вы получаете путь к маме / мамочке, выглядит так, как будто вы пытались интегрировать CoreDataпосле факта (вместо того, чтобы включить его при создании проекта).У меня были те же проблемы, что и у вас, вероятно.Код по умолчанию, который ищет momd, предполагает, что он существует, и вы также сможете это сделать, если добавите версию своей модели данных в проект.

Для этого выберите файл xcdatamodel ив меню «Дизайн» выберите «Модель данных»> «Добавить версию модели».Затем у вас будет CoreData.xcdatamodeld с поддеревом, содержащим Coredata.xcdatamodel и новую версию.Вы можете просто удалить дополнительную версию, и у вас будет нужная иерархия.Если вы соберетесь и загляните в комплект приложений, вы увидите каталог CoreData.momd с мамой внутри.

Эти шаги не включены ни в один из учебников по CoreData, которые я нашел до сих пор.Я надеюсь, что это полезно!

6 голосов
/ 27 декабря 2010

Практический ответ: Вы можете попробовать следующий код, если у вас есть проблемы с путями.Вы также должны убедиться, что ваш файл 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, создает свой собственный набор сложности.

http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdBasics.html#//apple_ref/doc/uid/TP40001650-TP1

4 голосов
/ 29 июня 2011

Мне показалось очень ценным взглянуть на мой исполняемый файл в симуляторе "образ диска".

Если вы зайдете в ~ / Библиотека / Поддержка приложений / iPhone Simulator // Приложения, вы сможете увидеть приложения на телефоне. Выясните, какой из них ваш (используйте поиск или посмотрите на дату), затем перейдите в ваш target.app и найдите файл .momd.

В моем случае имя momd отличалось от имени моего файла .xcdatamodeld, поэтому данные ядра не могли его загрузить. Как только я исправил имя в AppDelegate, все стало работать правильно.

Обратите внимание, что momd "file" на самом деле является каталогом (например, .app setup).

-

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

1 голос
/ 14 мая 2011

Если вы добавили версию к своей модели, измените .mom на .momd

    NSString *path = [[NSBundle mainBundle] pathForResource:@"CoreData" ofType:@"momd"];
if (!path) {
    path = [[NSBundle mainBundle] pathForResource:@"CoreData" ofType:@"momd"];
...