Основные данные; 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
Ответы
Ответ 1
Вот причина:
Модель, используемая для открытия магазина, несовместима с моделью, используемой для создания магазина.
И вот как ты это сделал:
- Вы создали несколько сущностей с некоторыми атрибутами и написали некоторый код
- Запустил приложение, возможно добавил контент
- Выйдите из приложения и добавьте/измените еще несколько объектов с атрибутами
- Возможно, вы снова запустили приложение, и теперь оно выдает ошибку
Причина этого в том, что ваша новая модель управляемых объектов пытается использовать более старую версию хранилища (впервые созданную при запуске приложения).
Быстрое и грязное исправление - удалить файл хранилища (где-то в ~/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
своим путем.