Я работаю над приложением для iPhone, которое использует Базовые Данные. Большинство раз я просто тестирую в средстве моделирования, но иногда качаю приложение вниз к iPad для проверки.
Я недавно изменил свою Базовую Модель данных, и теперь когда я отправляю приложение на iPad, я получаю исключение SIGABRT, говоря мне:
Can't merge models with two different entities named 'foo'
Хорошо, то, что я понимаю. Старая версия базы данных существует на устройстве. Так, я (пробуют к) уничтожаю старую версию нажатием/содержанием значок приложения, пока это не начинает шевелиться, и затем коснитесь "X". IPad спрашивает меня, если я хочу удалить приложение и все его данные. Я говорю да.
Я восстанавливаю приложение, будучи нацелен на iPad, и получаю ту же ошибку.
Существует ли прием к тому, чтобы заставлять старую базу данных действительно уйти?
Ваша ошибка сообщение не означает, что у вас есть две базы данных, т.е. постоянные хранилища. Это означает, что у вас есть два перекрывающихся файла модели (которые являются исходными файлами) в самом проекте Xcode. Удаление сборки нецелесообразно, потому что проект просто воссоздает ошибку при следующей сборке.
Файлы модели не могут перекрываться. Вам нужно убрать дублирование. Дублирование происходит из-за (1) наличия двух версий одного и того же файла или (2) наличия двух файлов модели с одним и тем же объектом в обоих.
Для (1) вам необходимо удалить старую копию. Файлы моделей имеют расширение имя_модели.xcdatamodel
. Чтобы найти дубликат, откройте цель и проверьте под Compile Sources
. Здесь будут перечислены все файлы моделей, включенные в цель. Удалите дубликат.
Для (2) вы можете иметь столько файлов модели, сколько хотите, но вы не можете иметь два файла модели с одним и тем же объектом в обоих. Иногда новички в Core Data пытаются связать файлы модели вместе, заставляя их совместно использовать одну или несколько сущностей. Если вы это сделали, вам нужно будет удалить повторяющийся объект из одной из моделей.
Постоянный магазин останется до тех пор, пока вы не удалите приложение с устройства, как в симуляторе. Если вы действительно хотите начать все сначала, удалите приложение с iPad, и он будет использовать новую модель.
Однако, как все уже отметили, это не та ошибка, которую вы получаете. Сделайте чистую сборку вашего приложения (то есть выберите Build -> Clean из меню в Xcode) и сделайте свежую сборку. Если ошибка все еще остается, значит в вашем проекте компилируется более одного файла xcdatamodel
.
"Не удается объединить модели с двумя разными сущностями с именем 'foo'"
Это больше похоже на слияние двух моделей данных. Попробуйте полностью пересобрать ваше приложение. Проверьте, действительно ли в вашем проекте только одна модель данных.
Стек данных ядра по умолчанию загружает все модели данных в вашем пакете
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
Если присутствуют старые модели, все они объединяются.
В конце концов вы захотите прочитать о миграции модели , поэтому вы можете автоматически обновлять базу данных основных данных на устройстве при обновлении пользователей.
Но если вы работаете в разработке и у вас нет установленных пользователей, вы можете стереть основную базу данных данных, зайдя в iTunes с подключенным устройством, удалив приложение со своего устройства и синхронизируя его. Затем перетащите новую версию вашего приложения в iTunes и выполните повторную синхронизацию. У вас должна получиться чистая модель.