Обновление / замена файла CoreData sqlite в приложении - PullRequest
4 голосов
/ 12 августа 2011

Мое приложение в настоящее время имеет этот файл sqlite (назовем его v1) Что я хочу сделать, так это то, что когда я активирую IBAction, он автоматически удалит текущий файл (v1) и получит значения из веб-сервиса и сохранит их в новом файле (v2), а затем приложение будет использовать новый файл sqlite (v2)

есть идеи о том, как реализовать?

мой текущий код здесь:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

if (persistentStoreCoordinator != nil) {
    return persistentStoreCoordinator;
}

NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"test.sqlite"]];
NSLog(@"%@",storeUrl);


NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}    

return persistentStoreCoordinator;

}

1 Ответ

5 голосов
/ 12 августа 2011

Вы можете:

  1. загрузить новую базу данных с сервера
  2. сбросить весь контекст базовых данных (координатор хранилища, контексты управляемого объекта, управляемые объекты)
  3. замените старую базу данных новой
  4. попросите обновить интерфейс пользователя, чтобы отобразить новейшее содержимое: контекст Core Data должен перезагрузиться лениво

Но этот подход довольно опасен, так каквам нужно убедиться, что каждый объект Core Data в вашем приложении может быть сброшен.Кроме того, замена базы данных должна произойти сразу после сброса контекста, чтобы избежать состояния гонки.Если у вас есть потоки / блоки, обращающиеся к Базовым данным, это еще сложнее.

Лучшим подходом может быть обновление записей базы данных путем загрузки файла JSON, который содержит содержимое новой базы данных, удаление старых записей и вставкановые.Это также гарантирует, что вы можете обновить свою базовую схему данных в будущей версии приложения, не нарушая процесс обновления контента.А с помощью класса NSFetchResultsController ваши представления таблиц или другие элементы пользовательского интерфейса могут даже автоматически обновляться с приятной анимацией при обновлении базы данных.

Если вам нужна пропускная способность, я использую протокольные буферы , которые намного более компактны, чем любой файл JSON или даже sqlite, и довольно просты в использовании.

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