основные данные не сохраняются между запусками

У меня возникла странная проблема с Core Data. В конкретном контроллере представления я загружаю представления из объектов в Core Data. Когда я запускаю приложение, при первой загрузке этого представления Core Data ничего не возвращает из моей выборки. Поэтому я повторно заполняю Core Data, и каждый раз, когда после этого отображается представление, оно правильно извлекает объекты из Core Data. Однако каждый раз, когда приложение запускается, оно ничего не находит в Core Data и затем снова создает объекты с нуля.

Так что же может привести к тому, что объекты Core Data будут сохраняться во время работы приложения, но не между запусками? Я ничего не делаю, чтобы удалить какие-либо объекты.

РЕДАКТИРОВАТЬ: И есть ли способ просмотреть, что на самом деле находится в Core Data? Как файл или что-то, на что я мог бы посмотреть? Это облегчило бы отладку этого.


person soleil    schedule 23.05.2013    source источник
comment
Как вы создаете постоянное хранилище, координатор и контекст?   -  person Wain    schedule 23.05.2013
comment
Возможно, вы не сохранили изменения. Это кажется маловероятным, но без какого-либо кода или хотя бы хорошего описания того, как это работает, это первая и наиболее очевидная возможность.   -  person Tom Harrington    schedule 23.05.2013
comment
Ну, здесь слишком много кода, поэтому мне просто интересно, есть ли сценарий, который может вызвать это. После дальнейшего тестирования это происходит в симуляторе, но не на устройстве. Устройство распознает сохраненные данные и не создает объекты с нуля. Любая идея, почему симулятор не будет сохраняться?   -  person soleil    schedule 23.05.2013
comment
Когда вы сохраняете изменения в Core Data, и это не удается, вы получаете «NSError», сообщающий вам, что произошло. Вы проверили это? Что он сказал?   -  person Tom Harrington    schedule 23.05.2013
comment
Пример кода работает для вас? Чем ваш код отличается от кода примера?   -  person GoZoner    schedule 23.05.2013
comment
@TomHarrington Я сохраняю изменения, но, похоже, мне нужно сделать как self.objectContext save:, так и [[CoreDataController sharedController] saveContext]; Если я не сделаю оба объекта, они не сохранятся.   -  person soleil    schedule 24.05.2013
comment
Да, хорошо, но вы так и не ответили на вопрос, а теперь вводите новые классы (CoreDataController), вообще не описывая их. Я не знаю, что случилось, и ты изо всех сил пытаешься помочь людям попытаться помочь тебе.   -  person Tom Harrington    schedule 24.05.2013


Ответы (2)


Убедитесь, что вы сохраняете контекст после ваших изменений. Метод шаблона:

- (void)saveContext {
    NSError *error = nil;
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil) {
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
            // Replace this implementation 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.
            NKLOG(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
    }
}

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

И найдите свой файл .sqlite, путь по умолчанию для вашего приложения будет таким:

/Users/YOUR_USER/Library/Application Support/iPhone Simulator/IOS_VERSION/Applications/GENERATED_HASH/Documents/YOUR_APP.sqlite

person iDevzilla    schedule 23.05.2013
comment
Аддон Firefox, о котором вы упомянули, выглядит так, как будто он может быть полезен. Я установил его, но как мне указать его на основной файл базы данных моего приложения? - person soleil; 24.05.2013
comment
Не обращайте внимания на вопрос о firefox. Я понял это. В чем разница между self.objectContext save: и [[CoreDataController sharedController] saveContext]; ? Кажется, я должен и то, и другое? - person soleil; 24.05.2013

Все файлы для вашего приложения можно проверить, найдя, где симулятор поместил ваше приложение. Вы можете потушить это с помощью NSLog( @"My database is at: '%@'", theDatabaseURL.path );

Поскольку все, что вы делаете в NSManagedObjectContext, сохраняется в памяти, имеет смысл, что оно будет сохраняться во время работы приложения, но исчезнет при следующем запуске приложения, если постоянное хранилище не настроено должным образом или операция сохранения не запускается. .

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

person LavaSlider    schedule 23.05.2013