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

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

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

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

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

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

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

9 ответов

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

У меня возникла эта проблема даже после того, как я следовал инструкциям по созданию новой версии моей модели данных. Я заметил, что в моем комплекте приложений было два файла ".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!:)

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

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

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

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

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

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

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

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

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

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

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

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

При наличии старых моделей все они объединяются.

У меня работала только "Сбросить контент и настройки" симулятора. в противном случае я не смог бы найти никаких проблем с моим проектом.

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

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

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

Другие вопросы по тегам