Основні дані - Не вдалося завантажити оптимізовану модель на шляху


76

Я отримую деякі з цих відбитків на консолі під час запуску програми з Xcode 6 на моєму iPhone 6 з iOS 9 beta 5:

CoreData: Не вдалося завантажити оптимізовану модель за шляхом '/var/mobile/Containers/Bundle/Application/0000000B-BDBC-0000-000B-0000FB00000B/Distribution.app/database.momd/database.omo'

Я не можу знайти щось пов’язане з цим, хтось знає про це повідомлення?


2
Я бачу подібне повідомлення за допомогою Xcode 6, але лише під час розгортання на пристрої iOS 9 або sim. Я не бачу цього під час запуску будь-якої iOS на пристрої або сима під час використання бета-версії Xcode 7. Отже, враховуючи те, що iOS 9 все ще знаходиться в бета-версії, я думаю, це помилка, характерна для комбінації Xcode 6 iOS 9. Поки що я ігнорую це. Мій додаток працює, як очікувалося, тому я не збираюся витрачати час на його вивчення, поки не побачу версії-кандидати на випуск iOS 9 / Xcode 7.
Тоні Адамс,

6
Я також отримую це з Xcode 7 GM. Будь-який поняття, про що це повідомлення про помилку?
Буджу

2
те саме з xcode 7 і iOS 9
Татарасану Віктор

1
така ж проблема виникає і для GoogleMaps
Nullify

2
Отримання цієї помилки в новому проекті після початку використання xcode 9 (оригінальна схема, створена за допомогою xcode 8).
lal

Відповіді:


13

Я зіткнувся з цим питанням і копався навколо.

Я будував за допомогою Xcode 6.4, і схоже, що раніше основні дані створювали лише файл .mom у каталозі momd MyApp.ipa. Цей скріншот зроблений з проекту, який бачив кілька версій Xcode.

Зверніть увагу, що у всіх старих версіях моделей є лише файл .mom. Я щойно створив нову версію моделі, і вона містить як файл .mom, так і файл .omo.

введіть тут опис зображення

Схоже, що Xcode 6.4 (і, можливо, також деякі з бета-версій 7.x) не знає, як завантажити оптимізовану версію моделі даних, оскільки я також отримую

2015-10-16 11:11:42.563 MyAppName[1767:599635] CoreData: Failed to load optimized model at path '/var/mobile/Containers/Bundle/Application/D887D60B-FB28-4059-8167-F573460D98F8/MyAppName.app/MyDataModel.momd/MyDataModel3_0Analytics.omo'

попередження при складанні з 6.4. Однак при компіляції програми з останньою версією магазину програм Xcode (7.0.1) я не отримую цього попередження. Я здогадуюсь, що причина рішення Махеша працює в тому, що перезапис усієї схеми створює файл .omo, який додаток шукає у наборі програм.

Рішенням для мене було створити нову версію моделі даних в основних даних, а потім побудувати за допомогою Xcode 7. Здається, створення нової версії моделі створює файл оптимізованої моделі. У ході мого тестування, навіть з цим файлом, створеним Xcode 6.4, все одно видає помилку. Лише коли я спробував його з Xcode 7.0.1, попередження зникло.

Це спекуляція, але я думаю, що якщо у вас є вже існуючий проект і ви не створили нову версію моделі даних і побудуєте за допомогою Xcode 7, що файл .omo відсутній, то він видає попередження, оскільки не може знайти файл. Однак, якщо ви створили версію своєї моделі даних і побудували за допомогою Xcode 6.4, здається, що попередня версія Xcode не робить щось правильно з оптимізованою версією, і вона не завантажує її, навіть якщо вона є. Це лише мої спостереження.

Я переконався, що маю оптимізовану модель (файл .omo) для завантаження, виконавши такі дії: 1. заархівуйте свій проект 2. змініть розширення .ipa на .zip 3. розгорніть zip-файл 4. натисніть на папку "payload" і клацніть правою кнопкою миші (або клацанням cmd) на наборі програм у папці та виберіть "Показати вміст пакета". 5. клацніть на каталог .momd, ви побачите там усі доступні керовані об'єктні моделі.

Якщо у вас є лише файли .mom, а файли .omo відсутні, то попередження має повний сенс, програма не може відкрити файл, який не існує.

У моєму тестуванні здається, що попередження мало лише інформаційний характер. Я ніколи не мав жодного збою через це. Здається, що основні дані можуть спробувати завантажити оптимізовану модель спочатку, і якщо це не вдасться, поверніться до звичайної моделі .momd. Однак це лише мої припущення.

Я не впевнений, що тут все цілком правильно, це саме те, що я спостерігав до цього часу, намагаючись це налагодити. Якщо хтось інший може надати більше інформації, я вітаю вашу інформацію.


"Під час мого тестування здається, що попередження було лише інформативним. У мене ніколи через це не було збоїв". У мене такий же досвід: я отримую попередження від Xcode 6, але все працює нормально. Мені трохи страшно відправити додаток до App Store з цим попередженням, яке все ще є, і я не можу створити його за допомогою Xcode 7 ... ми впевнені, що це лише попередження, і збоїв не відбудеться?
cdf1982

1
Я будував з Xcode 7, тому більше не відчував помилки, але не отримав від неї жодних збоїв у версії, яку я поставляв з Xcode 6. Якщо ви хочете відстежувати будь-які збої, які виникають, я рекомендую фреймворк тканини / крашлітика від Twitter.
digitalHound

4

Сьогодні вранці я зіткнувся з цією проблемою. Зробив невеликий хакер, щоб запустити його. Думаю, це пов’язано з невідповідністю версій, але я не впевнений.

У будь-якому випадку, якщо ви завантажуєте файл momd, просто додайте "/[filename].mom" до NSURL, щоб він працював.

У моєму випадку я завантажував файл Countly.momd і в підсумку робив це:

// Original loading
NSURL modelURL = [[NSBundle bundleForClass:[CountlyDB class]] URLForResource:@"Countly" withExtension:@"momd"];

// Small hack
modelURL = [modelURL URLByAppendingPathComponent:@"Countly.mom"];

Оновлення: я використовував POD, який використовував CoreData. Видалення стручка та додавання джерела тощо з репо безпосередньо змусило проблему піти.

Тож це може бути проблема з підручниками.


2
Гей - це незрозуміло для мене і, мабуть, для тонни інших читачів. Чи можете ви пояснити процес видалення стручка та додавання джерела з репо (де його взяти, що робити тощо). Ця помилка є великою проблемою, і ця публікація, здається, є єдиною річчю, де ви зробили щось, що працювало саме для вас. Якби ви могли детальніше розказати, ми були б вдячні за це.
kneuben_studdard

9
Так серйозно. Я отримую помилку з використанням стручка GoogleMaps, і це трапляється - /GoogleMaps.bundle/GMSCacheStorage.momd/Storage.omo '
durazno

ви використовуєте MagicalRecord? Чи може це бути пов’язано з MR + CocoaPods?
Буджу

1
Ця відповідь НЕВИННА. Питання не має нічого спільного з стручком. Не витрачайте свій час на випробування цього!
durazno

1
"Маленький хак" @ DiAvisoo врятував мені життя. У мене немає цього випуску стручків, про який ви, хлопці, говорили (я з майбутнього у 2017 році). Але я намагався додати зворотну сумісність у програмі Core Data, створеній у Xcode 9 для програми iOS 9.3+. Швидка версія 3 «маленького хака» DiAvisoo вирішила мою «велику» проблему: {code} let ios9modelURL = modelURL? .AppendingPathComponent ("Countly.mom") {code}.
Роб

3

Я знайшов рішення для цього. Я переписав цілу схему, і коли я запустив код, я позбувся цих попереджень з основних даних.

Пропоную, будь ласка, скористатися резервним копіюванням, перш ніж спробувати це.

Сподіваюся, це допоможе вам.


1
Так, я переписав схему.
Махеш,

9
Вибачте, але як схема переписана?
Маркус

3

Після довгих пошуків це було приблизно так:

public lazy var persistentContainer: NSPersistentContainer = {

    var modelURL = Bundle(for: type(of: self)).url(forResource: "Model", withExtension: "momd")!

    // ===> here you append the nameOfVersion.mom you created
    modelURL.appendPathComponent("Model 2.mom")
    let managedObjectModel = NSManagedObjectModel(contentsOf: modelURL)
    let container = NSPersistentContainer(name: "ModelFile", managedObjectModel: managedObjectModel!)

    container.persistentStoreDescriptions.first?.shouldInferMappingModelAutomatically = false

 ...

в чому причина shouldInferMappingModelAutomatically = false?
spnkr

тобто для міграцій, якщо у вас є кілька версій вашого Model. Якщо ви цього не зробите, просто видаліть
брахімм

0

Я хочу відповісти людям, які зіткнулися з цим, коли писали власний стручок, який має власні моделі CoreData. Можливо, ви вклали своє визначення моделі в набір (це добре), але ви шукаєте momdфайл у неправильному наборі.

Скажімо, ви визначили свій пакет у podspec так:

'MYPodBundle' => [
    'Model/*.{xcdatamodeld,xcdatamodel}'
]

Тоді ви повинні спочатку знайти цей пакет, а потім знайти вашу модель всередині нього .

NSURL *bundleURL = [[NSBundle bundleForClass:[MYEntity class]] URLForResource:@"MYPodBundle" withExtension:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithURL:bundleURL];
NSString *modelPath = [bundle pathForResource:@"MYCoreDataModel" ofType:@"momd"];
NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]];

Тож ви можете продовжувати створювати стек CoreData.

// Це може бути трохи нетопично, тому що ви не писали власний стручок, але ваша відповідь знаходиться на вершині Google.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.