2012-06-13 106 views
1

在將我的應用程序從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; 
    } 
    

    確實似乎對不對?代碼工作並在遷移後刪除數據並插入新副本。我只是討厭在每次應用程序啓動時檢查遷移。

  • 回答

    0

    如果您知道如何確定何時刪除舊數據,您只需要獲取所需的所有入口並將其刪除。這裏是你如何做到這一點(例如,如果你想刪除所有 enteties):

    NSFetchRequest * request = [[NSFetchRequest alloc] init]; 
    [request setEntity:[NSEntityDescription entityForName:@"Man" inManagedObjectContext:myContext]]; 
    [request setIncludesPropertyValues:NO]; //only fetch the managedObjectID 
    
    NSError * error = nil; 
    NSArray * men = [myContext executeFetchRequest:request error:&error]; 
    //error handling goes here 
    for (NSManagedObject * man in men) { 
        [myContext deleteObject:man]; 
    } 
    NSError *saveError = nil; 
    [myContext save:&saveError]; 
    //more error handling here 
    
    +0

    感謝尼基塔,是指出我朝着正確的方向發展。我已經通過問題修改了可能的解決方案。 – Joshua

    +0

    對我來說似乎是對的 –

    +0

    感謝您的幫助! – Joshua

    相關問題