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

Основные данные; Cocoa ошибка 134100

Это первый раз с основными данными, и я получаю следующую ошибку.

Я был бы очень признателен, если бы вы могли сказать мне, как это исправить.

Unresolved error Error Domain=NSCocoaErrorDomain Code=134100 "The operation couldn’t be completed. (Cocoa error 134100.)" UserInfo=0x5927880 {metadata=<CFBasicHash 0x59269a0 [0x1007400]>{type = immutable dict, count = 7,
entries =>
    2 : <CFString 0x5926e10 [0x1007400]>{contents = "NSStoreModelVersionIdentifiers"} = <CFArray 0x5927240 [0x1007400]>{type = immutable, count = 0, values = ()}
    4 : <CFString 0x5927190 [0x1007400]>{contents = "NSPersistenceFrameworkVersion"} = <CFNumber 0x5926ca0 [0x1007400]>{value = +320, type = kCFNumberSInt64Type}
    6 : <CFString 0x59271c0 [0x1007400]>{contents = "NSStoreModelVersionHashes"} = <CFBasicHash 0x5927340 [0x1007400]>{type = immutable dict, count = 2,
entries =>
    0 : <CFString 0x5927280 [0x1007400]>{contents = "Details"} = <CFData 0x59272f0 [0x1007400]>{length = 32, capacity = 32, bytes = 0x434e180241ecf461e59580e640ff926b ... aa456d1410ed9d1b}
    2 : <CFString 0x5927260 [0x1007400]>{contents = "History"} = <CFData 0x59272a0 [0x1007400]>{length = 32, capacity = 32, bytes = 0x3437f77a5563363f66b9d72ea76e0ff1 ... be194eb9dd17cddc}
}

    7 : <CFString 0xe238b0 [0x1007400]>{contents = "NSStoreUUID"} = <CFString 0x5926fc0 [0x1007400]>{contents = "6C5FECCB-0B64-46EB-809B-E0A4577D1E90"}
    8 : <CFString 0xe23720 [0x1007400]>{contents = "NSStoreType"} = <CFString 0xe238f0 [0x1007400]>{contents = "SQLite"}
    9 : <CFString 0x59271f0 [0x1007400]>{contents = "NSStoreModelVersionHashesVersion"} = <CFNumber 0x4d13e20 [0x1007400]>{value = +3, type = kCFNumberSInt32Type}
    10 : <CFString 0x5927220 [0x1007400]>{contents = "_NSAutoVacuumLevel"} = <CFString 0x5927380 [0x1007400]>{contents = "2"}
}
, reason=The model used to open the store is incompatible with the one used to create the store}, {
    metadata =     {
        NSPersistenceFrameworkVersion = 320;
        NSStoreModelVersionHashes =         {
            Details = <434e1802 41ecf461 e59580e6 40ff926b 20004ce9 58eb965f aa456d14 10ed9d1b>;
            History = <3437f77a 5563363f 66b9d72e a76e0ff1 ed7f70fd cb7035e9 be194eb9 dd17cddc>;
        };
        NSStoreModelVersionHashesVersion = 3;
        NSStoreModelVersionIdentifiers =         (
        );
        NSStoreType = SQLite;
        NSStoreUUID = "6C5FECCB-0B64-46EB-809B-E0A4577D1E90";
        "_NSAutoVacuumLevel" = 2;
    };
    reason = "The model used to open the store is incompatible with the one used to create the store";
}
sharedlibrary apply-load-rules all
Current language:  auto; currently objective-c
kill
quit
Program ended with exit code: 0

Мой код здесь: https://gist.github.com/898579

4b9b3361

Ответ 1

Вот причина:

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

И вот как ты это сделал:

  1. Вы создали несколько сущностей с некоторыми атрибутами и написали некоторый код
  2. Запустил приложение, возможно добавил контент
  3. Выйдите из приложения и добавьте/измените еще несколько объектов с атрибутами
  4. Возможно, вы снова запустили приложение, и теперь оно выдает ошибку

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

Быстрое и грязное исправление - удалить файл хранилища (где-то в ~/Library/Application Support/YOUR_APP/) и снова запустить ваше приложение.

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

Ответ 2

Этого достаточно, если вы удалите приложение с вашего симулятора/устройства.

Вам не нужно менять файлы в своем проекте (кроме выбора текущей модели и замены классов с помощью меню: Редактор/Создать подкласс NSManaged Object).

Ответ 3

Вы должны сделать следующие шаги

  • Удалите приложение и запустите его снова, если он все еще показывает ту же ошибку. Тогда это означает, что вы использовали конкретные атрибуты/атрибуты с другим типом.
  • Перейдите в ваш .xcdatamodeled файл и проверьте тип каждого атрибута.
  • Перейдите к своему коду и проверьте, вставляя атрибуты/объекты в основные данные, вы использовали один и тот же тип. Итак, точка - это тип (NSString, NSDate...) атрибутов/объектов в вашем коде, а .xcdatamodeled должен быть таким же. Если нет, то это даст ошибку "Ошибка домена = NSCocoaErrorDomain Code = 134100"

Ответ 4

Иногда вам нужно загружать данные из магазина, созданного другим приложением - например. одно приложение используется только для загрузки данных из внешнего источника и для сохранения в хранилище, а приложение othe использует это хранилище, полное данных, в качестве отправной точки.

Я не хочу сказать, что это суперправильно, но если вам это нужно время от времени во время разработки приложения: просто измените UUID в хранилище (по SQLVue и т.д.) на правильное, которое ожидается по вашему приложению. Вы найдете UUID в таблице, называемой в большинстве случаев ZMETADATA только в одном столбце с именем Z_UUID. Но помните - просто для быстрой отладки/разработки. Не используйте это программно.

Ответ 5

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

- (void)removeCoreDataStorage {
    // Where does the SQLite file go?
    NSArray *documentDirectories =
    NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                        NSUserDomainMask,
                                        YES);
    // Get one and only document directory from that list
    NSString *documentDirectory = [documentDirectories firstObject];
    NSString *path = [documentDirectory stringByAppendingPathComponent:@"model.sqlite"];

    NSError *error = nil;
    NSURL *storeURL = [NSURL fileURLWithPath:path];

    NSURL *storeURLWal = [NSURL URLWithString:[storeURL.absoluteString stringByReplacingOccurrencesOfString:@".sqlite" withString:@".sqlite-wal"]];
    NSURL *storeURLShm = [NSURL URLWithString:[storeURL.absoluteString stringByReplacingOccurrencesOfString:@".sqlite" withString:@".sqlite-shm"]];

    BOOL isRemoveItemAtURL = [[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error];
    if (isRemoveItemAtURL == NO) {
        NSLog(@"NO RemoveItemAtURL. Reason: %@", error.localizedFailureReason);
    }

    BOOL isRemoveItemAtURLWal = [[NSFileManager defaultManager] removeItemAtURL:storeURLWal error:&error];
    if (isRemoveItemAtURLWal == NO) {
        NSLog(@"NO RemoveItemAtURL. Reason: %@", error.localizedFailureReason);
    }

    BOOL isRemoveItemAtURLShm = [[NSFileManager defaultManager] removeItemAtURL:storeURLShm error:&error];
    if (isRemoveItemAtURLShm == NO) {
        NSLog(@"NO RemoveItemAtURL. Reason: %@", error.localizedFailureReason);
    }
}

Не забудьте изменить path своим путем.