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

Переименование файла coredata.xcdatamodeld и миграции

У нас было 2 разделенных приложения, которые мы объединили с двумя целями в одной рабочей области. Оба имеют свою базовую модель данных (app1.xcdatamodeld и app2.xcdatamodeld).

Теперь, когда оба находятся в одном и том же рабочем пространстве, нет необходимости в 2 моделях, так как они похожи на 99%. Поэтому я хочу изменить имя пакета .xcdatamodeld на 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 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>; }

Есть ли способ переименовать имя1.xdatamodel в name2.xdatamodel в уже запущенном приложении?

Спасибо

4b9b3361

Ответ 1

Вместо переименования app1.xcdatamodeld или app2.xcdatamodeld вы должны создать новый (allApps.xcdatamodeld). Эта новая модель может быть просто копией той модели, которую вы хотите сохранить.

Затем в каждой из двух целей добавьте файл .xcmappingmodel и привяжите его к allApps.xcdatamodeld и выполните необходимые переводы.

Как работает coreData, вы захотите сохранить исходные файлы app1 и app2 xcdatamodeld, чтобы гарантировать, что вы никогда не сломаете пользователя, у которого на вашем устройстве все еще работает самое старое приложение.

Файл > Создать > Файл > Основные данные > Модель сопоставления. Выберите исходную модель и нажмите "Далее". введите описание изображения здесь

Выберите целевую модель данных и нажмите "Далее". введите описание изображения здесь

Сделайте это снова в своей другой цели для приложения2, и вы должны быть в порядке.

Ответ 2

Попробуйте использовать управление версиями и облегченную миграцию,

Для более полного управления версиями и миграции вы можете проверить это.

Если выше не помогает, попробуйте это,

Во-первых, когда вы добавляете базовую модель данных в xcode, вы фактически получаете файл .xcdatamodeld, который представляет собой пакет, такой как файл .xcodeproj. В Finder вы можете щелкнуть правой кнопкой мыши и "Показать содержимое пакета". Вы увидите, что он содержит файл .xcdatamodel.

Мне кажется, вы не можете полностью переименовать его с помощью xcode. Xcode изменит имя файла пакета (momd), как вы видите его в пользовательском интерфейсе, но в файловой системе он фактически не изменился.

Ошибка модели nil, потому что она не может найти newfilename momd, поскольку она все еще имеет старое имя на диске. (Я думаю)

Я работал над этим, создав новую модель с именем, которое я хотел, затем в существующей модели вы можете щелкнуть мышью и выбрать свои сущности, а затем просто вставить их в новый файл модели. Затем вы можете удалить старый и зафиксировать все изменения в своем SCM.

Вы можете получить дополнительную помощь в отношении вышеуказанных шагов от этой ссылки.

Ответ 3

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

Ответ 4

  • Добавить версию модели
  • измените текущую версию модели на новую, затем удалите неиспользуемую версию модели шаг 2 подробно