Модель, используемая для открытия магазина, несовместима с той, которая используется для создания магазина

Я создал модель Core Data в xcode 3.2 и после обновления в Xcode 4.2 я добавил новую сущность подкласса NSManagedObject (обратитесь к новому объекту).

Во-первых, это выглядит странно, потому что это не в той же группе, что и старая. Вот изображение на моем xcode 4.2 (AlkitabDB - тот, который я создал в xcode 3.2, EndeDB является новым из текущей версии xcode (4.2):

the new entity do not grouped in xdatamodel

Во-вторых, я разрешаю это как есть, тогда я обратился ко второй сущности (новой) так же, как и первая сущность (старая), и появилась ошибка с названием.

Вот ошибка:

2012-01-16 21:13:38.496 iHuria[55953:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=134100 "The operation couldn’t be completed. (Cocoa error 134100.)" UserInfo=0x8829cd0 {metadata=<CFBasicHash 0x882a370 [0x1839b38]>{type = immutable dict, count = 7,
entries =>
    2 : <CFString 0x8829b90 [0x1839b38]>{contents = "NSStoreModelVersionIdentifiers"} = <CFArray 0x8829ff0 [0x1839b38]>{type = immutable, count = 0, values = ()}
    4 : <CFString 0x8829bc0 [0x1839b38]>{contents = "NSPersistenceFrameworkVersion"} = <CFNumber 0x8829770 [0x1839b38]>{value = +320, type = kCFNumberSInt64Type}
    6 : <CFString 0x8829bf0 [0x1839b38]>{contents = "NSStoreModelVersionHashes"} = <CFBasicHash 0x882a080 [0x1839b38]>{type = immutable dict, count = 1,
entries =>
    0 : <CFString 0x882a010 [0x1839b38]>{contents = "AlkitabDB"} = <CFData 0x882a030 [0x1839b38]>{length = 32, capacity = 32, bytes = 0xd02ac5f8be6ab0b39add450aca202ac0 ... 3d45d462998d2ccd}
}

    7 : <CFString 0x10e3aa8 [0x1839b38]>{contents = "NSStoreUUID"} = <CFString 0x8829e60 [0x1839b38]>{contents = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59"}
    8 : <CFString 0x10e3948 [0x1839b38]>{contents = "NSStoreType"} = <CFString 0x10e3958 [0x1839b38]>{contents = "SQLite"}
    9 : <CFString 0x8829c40 [0x1839b38]>{contents = "NSStoreModelVersionHashesVersion"} = <CFNumber 0x6b1c7c0 [0x1839b38]>{value = +3, type = kCFNumberSInt32Type}
    10 : <CFString 0x8829c70 [0x1839b38]>{contents = "_NSAutoVacuumLevel"} = <CFString 0x882a0c0 [0x1839b38]>{contents = "2"}
}
, reason=The model used to open the store is incompatible with the one used to create the store}, {
    metadata =     {
        NSPersistenceFrameworkVersion = 320;
        NSStoreModelVersionHashes =         {
            AlkitabDB = <d02ac5f8 be6ab0b3 9add450a ca202ac0 ebd1e860 cbb578c2 3d45d462 998d2ccd>;
        };
        NSStoreModelVersionHashesVersion = 3;
        NSStoreModelVersionIdentifiers =         (
        );
        NSStoreType = SQLite;
        NSStoreUUID = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59";
        "_NSAutoVacuumLevel" = 2;
    };
    reason = "The model used to open the store is incompatible with the one used to create the store";
}

Я искал решение раньше и обнаружил, что я должен удалить приложение из симулятора и повторно запустить приложение, и это не сработало. Кто-нибудь знает решение этой проблемы? Пожалуйста, помогите.

Ответ 1

Удалите приложение из симулятора и выполните очистку вашего проекта. Это должно устранить эти проблемы. Убедитесь, что вы не работаете в отладчике при удалении приложения, иначе он фактически не удалит его правильно.

Если вы хотите убедиться, что он ушел, проверьте этот каталог Users/INSERT_YOUR_USER_HERE/Library/Application Support/iPhone Simulator/ для своей папки приложения в той версии, в которой вы работаете.

Примечание. Это только для разработки. Для производства вам необходимо выполнить некоторую миграцию. Google "Core Data Migration", при этом легкая миграция является самой простой.

Ответ 2

Удаление приложения иногда не так! Предложите, ваше приложение уже опубликовано! Вы не можете просто добавить новый объект в базу данных и продолжить - вам нужно выполнить миграцию!

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

  1. Откройте файл .xcdatamodeld
  2. нажмите на редактор
  3. выберите Добавить версию модели...
  4. Добавьте новую версию вашей модели (добавлена новая группа моделей данных)
  5. выберите основной файл, откройте инспектор файлов (правая панель)
  6. и в разделе Versioned core data model выберите новую версию модели данных для текущей модели данных.
  7. ЭТО НЕ ВСЕ) Вы должны выполнить так называемую "легкую миграцию".
  8. Перейдите в ваш AppDelegate и найдите, где создается persistentStoreCoordinator
  9. Найдите эту строку, if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
  10. Замените nil параметры на @{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES} (фактически предоставляется в закомментированном коде в этом методе)
  11. Вот, пожалуйста, веселитесь!

PS Это касается только облегченной миграции. Чтобы ваша миграция квалифицировалась как легкая миграция, ваши изменения должны быть ограничены этой узкой полосой:

  • Добавить или удалить свойство (атрибут или отношение).
  • Сделать необязательное свойство необязательным.
  • Сделайте необязательный атрибут необязательным, если вы укажете значение по умолчанию.
  • Добавить или удалить объект.
  • Переименовать собственность.
  • Переименуйте объект.

Для Swift 4

coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true])

Ответ 3

Просто добавьте атрибут Параметры при создании файла persistentStoreCoordinator в файле AppDelegate.m для основного метода данных, как показано ниже

OBJECTIVE-C

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil)
    {
        return _persistentStoreCoordinator;
    }

    NSLog(@"persistentStoreCoordinator___");
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyApp.sqlite"];

    NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
    [options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
    [options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    NSLog(@"persistentStoreCoordinator___2");
    return _persistentStoreCoordinator;
}

СВИФТ

    lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
    // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail.
    // Create the coordinator and store
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
    let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("SingleViewCoreData.sqlite")
    var failureReason = "There was an error creating or loading the application saved data."

    // MAIN LINE OF CODE TO ADD
    let mOptions = [NSMigratePersistentStoresAutomaticallyOption: true,
                    NSInferMappingModelAutomaticallyOption: true]

    do {
        try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: mOptions)
    } catch {
        // Report any error we got.
        var dict = [String: AnyObject]()
        dict[NSLocalizedDescriptionKey] = "Failed to initialize the application saved data"
        dict[NSLocalizedFailureReasonErrorKey] = failureReason

        dict[NSUnderlyingErrorKey] = error as NSError
        let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
        // Replace this with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
        abort()
    }

    return coordinator
}

Он решил мою проблему.

Ответ 4

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

Примечание.. Когда вы выполняете изменения в определении основных данных, удалите приложение, установленное на физическом устройстве или симуляторе, снова очистите проект и снова постройте.

Ответ 5

Да. После удаления приложения на физическом устройстве и его восстановления он работает.

Ответ 6

Для быстрого доступа в AppDelegate.swift найдите строку

try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration:  nil, URL: url, options: nil )

и замените его на

try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration: nil, URL: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true])

Ответ 7

Я просто провел несколько дней, борясь с этой ошибкой, а также слиял с модамиModelFromBundles и получил сообщение "Невозможно объединить модели с двумя разными объектами с именем *".

Оказывается, проблема с корнем в том, что Xcode не удаляет старые ресурсы с устройств, и у меня были старые версии моей модели данных (файлы .mom), которые вызывали конфликты. Вот почему удаление приложения устраняет проблему на одном из моих устройств.

После нахождения этого сообщения в блоге через другой ответ SO я сделал свое приложение более терпимым к старым моделям, изменив эту строку, которая ищет ВСЕ. файлы мамы:

NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

который отображается только в каталоге Filters:

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

Я использовал recursivePathsForResourcesOfType из this this question: чтобы понять это, зарегистрировав все файлы .mom в приложении:

NSArray *momPaths = [self recursivePathsForResourcesOfType:@"mom" inDirectory:[[NSBundle mainBundle] resourcePath]];
NSLog(@"All .mom files:%@",momPaths);

Я также использовал iExplorer, чтобы посмотреть на посторонние файлы .mom(я еще не пытался их удалить).

Метод, приведенный ниже, также был полезен. Он показал, что объект находится в объединенной модели, возвращенной [psc managedObjectModel], которая больше не существовала ни в моей модели, ни в самом магазине. Именно это позволило мне поверить, что старая модель кэшировалась на самом устройстве, которое чистое здание не удаляло. Метод регистрирует каждый объект, который является одним и тем же, был изменен или добавлен в модель или удален из нее. (написано с помощью этого SO-ответа в качестве отправной точки):

- (BOOL)comparePersistentStore:(NSPersistentStoreCoordinator *)psc withStoreURL: (NSURL *)storeURL {
    NSError *error = nil;

    // Get the entities & keys from the persistent store coordinator
    NSManagedObjectModel *pscModel = [psc managedObjectModel];
    NSDictionary *pscEntities = [pscModel entitiesByName];
    NSSet *pscKeys = [NSSet setWithArray:[pscEntities allKeys]];
    //NSLog(@"psc model:%@", pscModel);
    //NSLog(@"psc keys:%@", pscKeys);
    NSLog(@"psc contains %d entities", [pscModel.entities count]);

    // Get the entity hashes from the storeURL
    NSDictionary *storeMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType
                                                                                          URL:storeURL
                                                                                        error:&error];
    NSDictionary *storeHashes = [storeMetadata objectForKey:@"NSStoreModelVersionHashes"];
    //NSLog(@"store metadata:%@", sourceMetadata);
    NSLog(@"store URL:%@", storeURL);
    NSLog(@"store NSStoreUUID:%@", [storeMetadata objectForKey:@"NSStoreUUID"]);
    NSLog(@"store NSStoreType:%@", [storeMetadata objectForKey:@"NSStoreType"]);
    NSSet *storeKeys = [NSSet setWithArray:[storeHashes allKeys]];

    // Determine store entities that were added, removed, and in common (to/with psc)
    NSMutableSet *addedEntities = [NSMutableSet setWithSet:pscKeys];
    NSMutableSet *removedEntities = [NSMutableSet setWithSet:storeKeys];
    NSMutableSet *commonEntities = [NSMutableSet setWithSet:pscKeys];
    NSMutableSet *changedEntities = [NSMutableSet new];
    [addedEntities minusSet:storeKeys];
    [removedEntities minusSet:pscKeys];
    [commonEntities minusSet:removedEntities];
    [commonEntities minusSet:addedEntities];

    // Determine entities that have changed (with different hashes)
    [commonEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
        NSData *storeHash = [storeHashes objectForKey:key];
        NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
        if ( ! [pscDescrip.versionHash isEqualToData:storeHash]) {
            if (storeHash != nil && pscDescrip.versionHash != nil) {
                [changedEntities addObject:key];
            }
        }
    }];

    // Remove changed entities from common list
    [commonEntities minusSet:changedEntities];

    if ([commonEntities count] > 0) {
        NSLog(@"Common entities:");
        [commonEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSData *storeHash = [storeHashes objectForKey:key];
            NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
            NSLog(@"\t%@:\t%@", key, pscDescrip.versionHash);
        }];
    }
    if ([changedEntities count] > 0) {
        NSLog(@"Changed entities:");
        [changedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSData *storeHash = [storeHashes objectForKey:key];
            NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
            NSLog(@"\tpsc   %@:\t%@", key, pscDescrip.versionHash);
            NSLog(@"\tstore %@:\t%@", key, storeHash);
    }];
    }
    if ([addedEntities count] > 0) {
        NSLog(@"Added entities to psc model (not in store):");
        [addedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
            NSLog(@"\t%@:\t%@", key, pscDescrip.versionHash);
        }];
    }
    if ([removedEntities count] > 0) {
        NSLog(@"Removed entities from psc model (exist in store):");
        [removedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSData *storeHash = [storeHashes objectForKey:key];
            NSLog(@"\t%@:\t%@", key, storeHash);
        }];
    }

    BOOL pscCompatibile = [pscModel isConfiguration:nil     compatibleWithStoreMetadata:storeMetadata];
    NSLog(@"Migration needed? %@", [email protected]"no":@"yes");

    return pscCompatibile;
}

use: вызывается перед добавлением каждого хранилища в NSPersistentStoreCoordinator:

    [self comparePersistentStore:self.psc withStoreURL:self.iCloudStoreURL];
    _iCloudStore = [self.psc addPersistentStoreWithType:NSSQLiteStoreType
                                          configuration:nil
                                                    URL:self.iCloudStoreURL
                                                options:options
                                                  error:&localError];

Ответ 8

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

Ответ 9

  • Остановить запуск приложения.
  • Удалить приложение на симуляторе.
  • ProductClean
  • Сборка, запуск.

Ответ 10

Самое простое решение, которое работало для меня в Swift 2.1, Xcode 7:

  • Удалите приложение из симулятора (Cmd + Shift + H, чтобы перейти на главный экран. Длинные нажмите приложение, нажмите "Крест", просто обычным способом удаления приложения с вашего телефона)

  • Cmd + Shift + H снова остановить танцы приложений

  • Вернитесь к своему проекту и снова запустите

У меня была эта проблема при записи/чтении из Core Data с двумя созданными объектами. При удалении приложения и повторной попытке программы исправлена ​​проблема

Ответ 11

Я только что удалил файл [Simulator App Folder]/Document/*.sqlite после внесения изменений в сущности, и он сработал. И, конечно, файл .sqlite содержит все сохраненные данные и структуры, которые будут потеряны.

Ответ 12

Пожалуйста, удалите приложение с симулятора и очистите код и запустите .it работают нормально. Возможно, это поможет вам.

Ответ 13

Если вы используете Swift.

Следуйте за ответом @Stas и вставьте опции вместо nil в свой делегат приложения:

let myOptions = [NSMigratePersistentStoresAutomaticallyOption: true,
            NSInferMappingModelAutomaticallyOption: true]
        if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: myOptions, error: &error) == nil {

Ответ 14

Попробуйте "Reset Содержание и настройки" в симуляторе. Работала для меня после удаления приложения и Clean build

Ответ 15

У меня возникла такая же проблема с моим приложением (еще не выпущенным в App Store).

Вот как я его исправил:

  • Run Clean (Cmd + Shift + K)
  • Перезагрузите iOS Simulator
  • iOS Simulator → Reset Содержимое и настройки (из навигационной панели)

(3) был шагом, который, наконец, заставил его работать должным образом. Надеюсь, это поможет!

Ответ 16

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

Если это так, вам нужно позаботиться о переносе старых данных в новую схему:

Управление версиями модели данных и переноса данных

Ответ 18

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

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

Подробности можно найти в Руководство по программированию версий и преобразования данных в Core Data Model.

Обновление
Этот ответ здесь о переполнении стека описывает основы легкой миграции данных Core Data, а также имеет некоторый код для запуска.

Ответ 19

Во-первых, единственное, что должно быть в пакете xcdatamodeld, это xcdatamodel файлы. Ваши подклассы должны НЕ находиться в xcdatamodeld. Переместите их оттуда. Есть справедливый шанс, что они запутывают компилятор.

Во-вторых, ошибка указывает, что Core Data не может найти вашу модель. Вы создали данные, а затем коснулись модели? Если это так, вы находитесь в противоречивом состоянии и должны исправить это либо путем удаления данных (что предложил Филипп), либо путем изменения ваших изменений модели НАЗАД.

Ответ 20

Эта проблема обычно возникает из-за несовместимости между версией, на которой была создана DB. Общий подход к этой проблеме заключается в удалении приложения и переустановке. Но в вашем случае версия DB полностью отличается от Xcode 3.2 и 4.2. Поэтому лучше использовать ту же версию Xcode для DB.

Ответ 21

Я получал ошибку, но причина, по которой я получал ошибку, состояла в следующем:

Вначале я имел одну Entity с именем "Entry" и имел одну строку, сохраненную для этого объекта в базе данных. Затем я добавил еще один Entity с именем "Person" и после добавления, который пошел на сборку и получил ошибку. Поэтому я решил проблему, удалив "Person" Entity, а затем создав приложение, удалив строку, которая была в "Entry", а затем закрыла приложение. Затем я полностью удалил приложение с моего телефона, а затем восстановил его, и он работал нормально. Не уверен, какой шаг исправил проблему (удаление строки или приложения), но, надеюсь, если вы ищете решение, это поможет.:)

Изменить: О, и если вы беспокоитесь об удалении своего нового Entity (в моем случае "Person" ), чтобы снова создать приложение, помните, что вы можете вернуть его позже, используя CMD + Z!

Ответ 22

У меня была эта проблема - я сначала reset мой симулятор, а затем очистил проект и перестроил. И затем он работает.

Ответ 23

При изменении данных ядра (добавление поля в таблицу, удаление поля и т.д.), файл sqlite в папке документов приложений должен быть синхронизирован с вашей схемой.

Этот файл не перезаписывается по умолчанию, этот файл необходимо восстановить.

Выполните следующие действия:

  • Перейдите в папку, указанную NSURL. (Этот путь может быть найден в сообщении об исключении, сгенерированном приложением перед сбоем.) пример:/Пользователи//Library/Поддержка приложений/Симулятор iPhone//Приложения//Документы

  • удалить или переименовать файл sqlite

  • Очистить и перезапустить приложение
  • Приложение Rerunning создаст новый файл sqlite.

Это обеспечит синхронизацию схемы и Xcode.

Ответ 24

Для разработки приложений Mac:

  1. Очистить проект
  2. Очистить полученные данные
  3. Перейдите в /Users/YOUR_NAME/Library/Containers/YOUR_APP_BUNDLE_ID/Data/Documents/и удалите все файлы внутри (такие как ".sqlite", ".sqlite-shm"...)

Это сработало для меня, надеюсь, это могло бы быть полезным.

Ответ 25

iOS Simulator → Reset Содержание и настройки...

Работал для меня

iOS Simulator → Reset Содержание и настройки... → Reset Работает на iOS9 (xcode 7.1), а также