Основные данные; Какао ошибка 134100 - PullRequest
19 голосов
/ 01 апреля 2011

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

Буду очень признателен, если вы подскажете, как это исправить.

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

Ответы [ 5 ]

61 голосов
/ 01 апреля 2011

Вот причина:

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

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

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

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

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

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

14 голосов
/ 06 августа 2012

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

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

1 голос
/ 18 декабря 2013

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

  1. Удалите приложение и запустите его снова, если оно по-прежнему показывает ту же ошибку.Тогда это означает, что вы использовали определенные атрибуты / атрибуты с другим типом.
  2. Перейдите в файл .xcdatamodeled и проверьте тип каждого атрибута.вставляя атрибуты / объекты в основные данные, вы использовали один и тот же тип разных.Таким образом, точка - это тип (NSString, NSDate ...) атрибутов / объектов в вашем коде, и .xcdatamodeled должен быть одинаковым.Если нет, то это выдаст ошибку «Ошибка домена = код NSCocoaErrorDomain = 134100»
0 голосов
/ 17 октября 2016

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

- (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 своим собственным путем.

0 голосов
/ 01 апреля 2013

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...