Переименование coredata.xcdatamodeld файл и миграции
у нас было 2 отдельных приложения, которые мы объединили в 2 цели в одной рабочей области. Оба имели свою основную модель данных (app1.xcdatamodeld
и app2.xcdatamodeld
).
теперь, когда оба находятся в одном рабочем пространстве, нет необходимости в 2 моделях, поскольку они на 99% похожи. Поэтому я хочу изменить название до allApps.xcdatamodeld
. Я смог переименовать его, но при этом не нашел никакой ссылки на поведение миграции.
Это ошибка -
2015-07-28 09:04:06.079 AppName[51306:1423128] CoreData: error:
-addPersistentStoreWithType:SQLite configuration:(null) URL:file:///Users/shani/Library/Developer/CoreSimulator/Devices/EA75A69F-B108-4036-AB3D-B923F83D16DE/data/Containers/Data/Application/B1CB3AF3-DEF4-40DF-9A61-721063ECBB1D/Documents/AppName.sqlite
options:{
NSInferMappingModelAutomaticallyOption = 1;
NSMigratePersistentStoresAutomaticallyOption = 1;
NSSQLitePragmasOption = {
"journal_mode" = WAL;
}; } ... returned error Error Domain=NSCocoaErrorDomain Code=134130 "The operation couldn’t be completed. (Cocoa error
134130.)" UserInfo=0x7fc39c194360 {URL=file:///Users/shani/Library/Developer/CoreSimulator/Devices/EA75A69F-B108-4036-AB3D-B923F83D16DE/data/Containers/Data/Application/B1CB3AF3-DEF4-40DF-9A61-721063ECBB1D/Documents/AppName.sqlite,
metadata={
NSPersistenceFrameworkVersion = 519;
NSStoreModelVersionHashes = {
Attempt = <b4d1e878 69a97917 e751a67c 89e1887a ae4df1dc f380e4ee c9585f60 f39ff51e>;
BookmarkFlashcard = <33112f7c 2fa20bec eb2e019c b5d619b4 92be2547 a65fabee 1ac86ab7 92dd77bb>;
BookmarkQuestion = <38634b49 71f0d43c 6f9fbba9 bc2f1b81 675c9b3c f2da017e fc8de9d8 4e18a4a0>;
Category = <b0e4d91b 0c0ebc71 ed0f403c 9a0eec20 fc1686aa 0169bc60 4bcc7e57 165bce15>;
};
NSStoreModelVersionHashesVersion = 3;
NSStoreModelVersionIdentifiers = (
""
);
NSStoreType = SQLite;
NSStoreUUID = "F1B37CD0-8B89-4893-A262-1013C3544026";
"_NSAutoVacuumLevel" = 2; }, reason=Can't find model for source store} with userInfo dictionary {
URL = "file:///Users/shani/Library/Developer/CoreSimulator/Devices/EA75A69F-B108-4036-AB3D-B923F83D16DE/data/Containers/Data/Application/B1CB3AF3-DEF4-40DF-9A61-721063ECBB1D/Documents/AppName.sqlite";
metadata = {
NSPersistenceFrameworkVersion = 519;
NSStoreModelVersionHashes = {
Attempt = <b4d1e878 69a97917 e751a67c 89e1887a ae4df1dc f380e4ee c9585f60 f39ff51e>;
BookmarkFlashcard = <33112f7c 2fa20bec eb2e019c b5d619b4 92be2547 a65fabee 1ac86ab7 92dd77bb>;
BookmarkQuestion = <38634b49 71f0d43c 6f9fbba9 bc2f1b81 675c9b3c f2da017e fc8de9d8 4e18a4a0>;
Category = <b0e4d91b 0c0ebc71 ed0f403c 9a0eec20 fc1686aa 0169bc60 4bcc7e57 165bce15>;
};
NSStoreModelVersionHashesVersion = 3;
NSStoreModelVersionIdentifiers = (
""
);
NSStoreType = SQLite;
NSStoreUUID = "F1B37CD0-8B89-4893-A262-1013C3544026";
"_NSAutoVacuumLevel" = 2;
};
reason = "Can't find model for source store"; } 2015-07-28 09:04:06.089 AppName[51306:1423128] CoreData: annotation:
NSPersistentStoreCoordinator's current model hashes are {
Attempt = <b4d1e878 69a97917 e751a67c 89e1887a ae4df1dc f380e4ee c9585f60 f39ff51e>;
BookmarkFlashcard = <33112f7c 2fa20bec eb2e019c b5d619b4 92be2547 a65fabee 1ac86ab7 92dd77bb>;
BookmarkQuestion = <38634b49 71f0d43c 6f9fbba9 bc2f1b81 675c9b3c f2da017e fc8de9d8 4e18a4a0>;
Category = <b0e4d91b 0c0ebc71 ed0f403c 9a0eec20 fc1686aa 0169bc60 4bcc7e57 165bce15>; }
есть ли способ переименовать name1.xdatamodel в name2.xdatamodel в приложении, которое уже находится в производстве ?
спасибо
4 ответов
вместо переименования app1.xcdatamodeld или app2.xcdatamodeld вы должны создать новый (allApps.xcdatamodeld). Эта новая модель может быть просто копией той модели, которую вы хотите сохранить.
затем в каждой из двух целей добавьте an .xcmappingmodel файл и связать его с allApps.xcdatamodeld и выполнять любые необходимые переводы.
Как работает coreData, вы захотите сохранить исходные файлы app1 и app2 xcdatamodeld, чтобы убедиться, что вы никогда перерыв пользователя, у которого на устройстве все еще работает ваше самое старое приложение.
Файл > Создать > Файл > Основные Данные > Модель Отображения. Выберите исходную модель и нажмите кнопку Далее.
выберите целевую модель данных и нажмите кнопку Далее.
сделайте это снова в другой цели для app2, и вы должны быть в порядке.
попробуйте использовать управление версиями и облегченную миграцию,
для более управления версиями и миграции вы можете зацени.
Если выше не помогает, то попробуйте это таким образом,
во-первых, когда вы добавляете модель основных данных в xcode, вы фактически получаете .xcdatamodeld файл, который является пакетом, как .xcodeproj файл. В finder вы можете щелкнуть правой кнопкой мыши и "показать содержимое пакета". Вы увидите, что он содержит a .xcdatamodel все файл.
Мне кажется, вы не можете переименовать его полностью с помощью xcode. Xcode изменит имя файла пакета (momd), как вы видите его в пользовательском интерфейсе, но в файловой системе он фактически не изменился.
ошибка модели nil, которую вы получаете, потому что она не может найти newfilename momd, так как у нее все еще есть старое имя на диске. (Я думаю)
Я обошел это, создав новую модель с именем, которое я хотел, затем в существующей модели вы можете нажать-перетащить и выбрать ваши сущности, а затем просто вставьте их в файл новой модели. Затем вы можете удалить старый и зафиксировать все изменения в SCM.
вы можете получить больше помощи относительно вышеуказанных шагов от этой ссылке.
просто нажмите правой кнопкой мыши .xcdatamodeld показать в Finder и переименовать его. Удалите из пакета, выходящего из одного, и перетащите переименованный .xcdatamodeld, теперь очистите сборку, проверьте перед запуском отношения между моделями, если есть и запустите снова.
- Добавить Версию Модели
- измените текущую версию модели на новую, затем удалите неиспользуемую версию модели Шаг 2 деталь