在將我的應用程序從v1升級到v2時,我對Core Data Model進行了一些小改動。這些更改只是爲模型添加新屬性。輕量級遷移後如何從核心數據中刪除數據
我已經版本與之前和之後的變化數據模型和我的應用程序委託執行以下代碼:
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (__persistentStoreCoordinator != nil)
{
return __persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"ISDEmployees.sqlite"];
NSLog(@"storeURL:%@",storeURL);
NSError *error = nil;
// Create a dictionary for automatic lightweight core data migration
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
// Set up the persistent store and migrate if needed
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return __persistentStoreCoordinator;
}
基本標準persistentStoreCoordinator與另外的遷移選項。這段代碼效果很好,我的數據庫成功更新。我遇到的問題是數據庫更新後,我需要刷新數據庫中的所有數據,以便填充新列。我在想,我會從相關實體/表中刪除數據,並強制應用程序重新下載具有添加的列/屬性的新數據集。
我不知道如何/在哪裏執行刪除/更新。一般的應用流程是這樣的:在對一個網絡API
- 日誌,調用API,並獲得最新添加/更新的記錄。
- 顯示更新的數據
我知道我可以檢查,看看是否需要遷移通過將此代碼添加到persistentStoreCoordinator:
// Get the current data store meta data
BOOL migrationNeeded = NO;
NSDictionary *existingStoreData = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:storeURL error:&error];
if (existingStoreData)
{
// Check to see if new model is not the same as the existing mode, meaning a migration is required
if (![self.managedObjectModel isConfiguration:nil compatibleWithStoreMetadata:existingStoreData])
{
migrationNeeded = YES;
}
}
任何幫助將不勝感激!
更新#1:
根據下面的反饋,我已經做了以下修改:
改變了migrationNeeded從本地對AppDelegate中一個公共類變量。 在登錄查看,我已經添加了以下方法:
- (void)checkForDatabaseMigration
{
// Get a copy of the managed object context. If a migration is needed, it will kick it off
NSManagedObjectContext *managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
if ([(AppDelegate *)[[UIApplication sharedApplication] delegate] migrationNeeded])
{
// Delete all data from the table
}
managedObjectContext = nil;
}
確實似乎對不對?代碼工作並在遷移後刪除數據並插入新副本。我只是討厭在每次應用程序啓動時檢查遷移。
感謝尼基塔,是指出我朝着正確的方向發展。我已經通過問題修改了可能的解決方案。 – Joshua
對我來說似乎是對的 –
感謝您的幫助! – Joshua