2012-09-13 3 views
3

У меня есть приложение с базовыми данными, которое резервирует свою базу данных sqlite для Dropbox, и пользователь может восстановить ее, перезаписав свою текущую базу данных, если/когда им нужно.Как восстановить базу данных SQLite из резервной копии после изменения модели данных Core (легкая миграция)

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

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

Есть ли способ обновить базу данных во время процесса восстановления, чтобы соответствовать моей модели данных ядра? Или процесс, который я могу запустить, или некоторые шаги, которые я могу предпринять, чтобы убедиться, что резервная копия не потеряна?

+0

Это по-прежнему является проблемой для меня. Я обеспокоен тем, что мои пользователи попытаются загрузить свои старые файлы SQLite и будут сердиться, когда им скажут, что им нужно сначала создать новую резервную копию. Может ли кто-нибудь помочь с этой проблемой? – SAHM

+0

Я пытаюсь решить ту же проблему ... Вы когда-нибудь придумывали решение для этого? – cowfaboo

+0

Да, на самом деле я только что восстановил базу данных (как описано ниже) после того, как легкая миграция уже состоялась, и все сработало просто отлично. Я был счастлив удивлен. Вы уже пробовали? – SAHM

ответ

1

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

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

-(BOOL) storeRequiresMigration: (NSURL *) storeURL { 
NSError *error = nil; 
NSPersistentStoreCoordinator * temporaryPersistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 

//Check if migration is needed 
NSDictionary *sourceMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:storeURL error:&error]; 
NSManagedObjectModel *destinationModel = [temporaryPersistentStoreCoordinator managedObjectModel]; 
BOOL isCompatibile = [destinationModel isConfiguration:nil compatibleWithStoreMetadata:sourceMetadata]; 
NSLog(@"Store requires migration: %d", !isCompatibile); 
return !isCompatibile; 

}

0

Как долго вы сохраняете свои предыдущие версии модели данных в приложении, облегченная миграция должна позаботиться об этом процессе для вас. Судя по вашему вопросу, я считаю, что это именно то, о чем заботится легкая миграция. Он отображает изменения в предыдущей версии модели данных и отображает ваши старые данные в новую модель данных.

В специальном случае, который вы хотите переименовать в своей модели данных, вы можете сделать это, используя Идентификатор переименования, расположенный в инспекторе в разделе «Версии».

+0

Спасибо bbodayle, но уточните: пользователь будет вручную восстанавливать базу данных sqlite, заменяя ее базой данных, загруженной из Dropbox. Затем я предпринимаю шаги для сброса данных на основе недавно загруженной базы данных. В этом процессе ничего не происходит автоматически - здесь не происходит легкой миграции. Легкая миграция происходит только тогда, когда пользователь обновляет приложение. Таким образом, в этом случае у пользователя есть приложение, в котором данные были перенесены, и пытается заменить обновленную базу данных старой версией базы данных. – SAHM

Смежные вопросы