Замена файла Core Data sqlite во время работы приложения, данные не обновляются - PullRequest
5 голосов
/ 30 июля 2010

Я разрабатываю систему резервного копирования / восстановления для моего приложения, в которой пользователь может загрузить резервную копию резервной копии основного хранилища данных (файл sqlite) и заменить используемое в настоящее время хранилище данных загруженным файлом. Однако, как только пользователь загрузит файл и заменит текущее хранилище данных, ни одна из данных не будет обновлена. Но когда приложение закрывается и перезапускается, восстановленные данные становятся доступными. Как заставить мое приложение перезагрузить файл основного хранилища данных?

Я попытался получить доступ к делегату приложения из моего UIViewController, который восстанавливает данные, например, чтобы перестроить основной стек данных и распространить его на все контроллеры представления в стеке навигации:

MyAppDelegate *app = [[UIApplication sharedApplication] delegate];
app.managedObjectContext = nil;
app.persistentStoreCoordinator = nil;
app.managedObjectModel = nil;
managedObjectContext = [app managedObjectContext];

NSArray *controllers = [self.navigationController viewControllers];
UIViewController *c;
for (int i = 0; i < [controllers count]; i++) {
    c = [controllers objectAtIndex:i];
    [c setManagedObjectContext:managedObjectContext];
}

Но это не работает, выдает только следующую ошибку, когда я возвращаюсь к контроллеру корневого представления: 'The NSManagedObject with ID:0x5d79060 <x-coredata://D8E73D64-C9BA-4CFA-9213-F8BD61749155/MyObject/p2> has been invalidated.'

Кто-нибудь знает, как заставить приложение перезагрузить данные и начать работу с новым файлом хранилища данных?

1 Ответ

1 голос
/ 30 июля 2010

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

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

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