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

Основные данные: ошибка "Невозможно объединить модели с двумя разными объектами, названными" foo "

Я работаю над iPhone-приложением, которое использует Core Data. В большинстве случаев, я просто тестирую в симуляторе, но иногда закачиваю приложение на iPad, чтобы убедиться.

Недавно я изменил модель Core Data, и теперь, когда я отправляю приложение на iPad, я получаю исключение SIGABRT, говорящее мне:

 Can't merge models with two different entities named 'foo'

Хорошо, что я понимаю. На устройстве существует старая версия базы данных. Итак, я (попытаюсь) убить старую версию, нажав/удерживая значок приложения, пока он не начнет шевелить, а затем коснитесь его "X". IPad спрашивает меня, хочу ли я удалить приложение и все его данные. Я говорю "да".

Я перестраиваю приложение, нацеленное на iPad, и получаю ту же ошибку.

Есть ли трюк, чтобы заставить старую базу данных действительно уйти?

4b9b3361

Ответ 1

Для тех, кто сталкивается с этим вопросом, пытаясь использовать основные данные, облегчающие миграцию:

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

Ключом является замена реализации - (NSManagedObjectModel *)managedObjectModel, созданной для вас с помощью этой реализации:

- (NSManagedObjectModel *)managedObjectModel {

    if (managedObjectModel != nil) {
        return managedObjectModel;
    }

    NSString *path = [[NSBundle mainBundle] pathForResource:@"Foo" ofType:@"momd"];
    NSURL *momURL = [NSURL fileURLWithPath:path];
    managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];

    return managedObjectModel; }

где 'Foo' - это имя вашей модели данных.

Надеюсь, это полезно кому-то - я потратил ПУТЬ слишком много часов, извивая мою голову от стены на этом. Еще раз спасибо, Apple!:)

Ответ 2

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

Однако, как указали все остальные, это не ошибка, которую вы получаете, выполните чистую сборку вашего приложения (это означает, что выберите "Build → Clean" из меню в Xcode) и выполните новую сборку. Если ошибка по-прежнему сохраняется, у вас есть более одного файла xcdatamodel, скомпилированного в вашем проекте.

Ответ 3

Ваше сообщение об ошибке не означает, что у вас есть две базы данных, то есть постоянные хранилища. Это означает, что у вас есть два дублирующих файла модели (которые являются исходными файлами) в самом проекте Xcode. Удаление сборки не очень хорошо, потому что проект просто воссоздает ошибку при следующей сборке.

Файлы моделей не могут пересекаться. Вам нужно удалить дублирование. Дублирование происходит либо из (1), имеющих две версии одного и того же файла, либо (2) с двумя файлами модели с одним и тем же объектом в обоих.

Для (1) вам нужно удалить старый дубликат. Файлы модели имеют расширение modelName.xcdatamodel. Чтобы найти дубликат, откройте цель и установите флажок Compile Sources. Все файлы моделей, включенные в цель, будут указаны там. Удалите дубликат.

Для (2) вы можете иметь столько файлов моделей, сколько хотите, но у вас не может быть двух файлов модели с одним и тем же объектом в обоих. Иногда новички Core Data пытаются связать файлы модели вместе с тем, что у них есть один или несколько объектов. Если вы это сделали, вам нужно будет удалить дублирующийся объект с одной из моделей.

Ответ 4

Удалите приложение с iPad, а затем перезапустите его. После того, как iPad перезагрузился, выполните чистую сборку.

Ответ 5

У меня была аналогичная проблема после переименования модели базы данных. После очистки, перестройки и повторной установки приложения - те же последствия: в комплекте приложений появляются два разных пакета .momd с таким же содержимым (oldname.momd и newname.momd).
Я решил эту проблему, изменив "Версия инструментов" с 4.1 до 3.2 в панели "Модель основных данных" ( "Файл-инспектор модели данных" ). После этого я полностью очистил и перестроил проект, а затем изменил это свойство на 4.1 и снова снова очистил и перестроил приложение.
В этом случае Xcode делает два файла "макет" и "элементы" (для более старой совместимости версий) против "содержимого" в пакете *.xcdatamodeld, это приводит к тому, что компилятор модели данных Xcode перепроверяет имя модели и там все будет в порядке. momd в песочнице приложений - появляется только одна из них после переустановки приложения.

Ответ 6

"Невозможно объединить модели с двумя разные объекты с именем 'foo'"

Это похоже на то, что два datamodels сливаются. Попробуйте чистую перестройку своего приложения. Проверьте, действительно ли в вашем проекте есть только один datamodel.

Стандартный стек данных ядра загружает все модели данных в ваш пакет

managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];   

Если присутствуют старые модели, все они объединены.

Ответ 7

для меня работал только контент Reset и настройки "симулятора. иначе я не мог найти никаких проблем с моим проектом.

Ответ 8

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

Но если вы работаете в dev и у вас нет установленных пользователей, вы можете стереть базовую базу данных, перейдя в iTunes с подключенным устройством, удалив приложение с вашего устройства и синхронизировав его. Затем перетащите новую версию своего приложения в iTunes и выполните повторную синхронизацию. У вас должна быть чистая модель.

Ответ 9

У меня была та же проблема.
Попробуйте очистить Shift + Cmnd + K и очистить папку сборки ALT + Shift + Cmnd + K в Xcode. Это сработало для меня хорошо.