2013-12-21 117 views
1

在我的應用程序我已經使用核心數據自動輕量級移植罰款的多個版本。大約一年前,我實現了iOS文件共享,因此我將sqlite數據庫移到了/ Library文件夾而不是/ Documents目錄,以保持它隱藏。自那時起,我還沒有添加另一個核心數據版本。核心數據移動sqlite文件後自動輕量級遷移失敗

現在,當我嘗試添加另一個實體,增加模型版本我得到以下錯誤(截斷爲只顯示尾端):

"_NSAutoVacuumLevel" = 2; 
}, reason=Can't find model for source store} 
Terminating app due to uncaught exception  
'NSInternalInconsistencyException', reason: 
'This NSPersistentStoreCoordinator has no persistent stores. 
It cannot perform a save operation.' 

我驗證過.sqlite文件存在於如預期的那樣。我已經解決了幾天,似乎如果我將sqlite文件移回到/ Documents目錄,遷移工作正常。

下面是持久存儲協調代碼:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
if (persistentStoreCoordinator != nil) { 
    return persistentStoreCoordinator; 
} 

NSURL *storeUrl = [NSURL fileURLWithPath: [[self libraryDocumentsDirectory] stringByAppendingPathComponent: @"myappdb.sqlite"]]; 

NSError *error = nil; 
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] 
           initWithManagedObjectModel:[self managedObjectModel]]; 

//Pass options in for lightweight migration....  
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 

if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
              configuration:nil URL:storeUrl options:options error:&error]) { 
    /*Error for store creation should be handled in here*/ 
    NSLog(@"ERROR IN MIGRATION........%@", error);   
} 

return persistentStoreCoordinator; 
} 

- (NSString *)libraryDocumentsDirectory { 
return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject]; 
} 

有沒有人遇到過這種情況之前?

在此先感謝您的幫助。

+0

我的猜測是你的代碼正在尋找舊的目錄而不是新的目錄。一些細節將不勝感激。換句話說,你的代碼正在尋找Document dir。也許這就是問題所在。嘗試修改路徑。 –

+0

顯示創建核心數據堆棧的代碼,以便我們可以診斷問題。 –

回答

0

「現在,當我嘗試廣告另一個模型實體和增加版本號......」

你需要創建一個新的實體或修改現有實體之前創建一個新的模型版本。確保您的更改沒有錯誤地在舊版本中進行。

+0

謝謝鄧肯。我首先添加了另一個版本(編輯器 - >添加模型版本...),並且我已經將模型版本設置爲我使用其中的更改創建的最新模型,但它仍然不起作用。我有其他的應用程序,我已經使用輕量級遷移沒有任何問題,但似乎將sqlite數據庫移動到庫文件夾導致問題。 – draftalyzer

+0

因此,如果文件沒有移動,那麼升級沒有任何問題?如果您在升級後移動文件,則可以在新位置打開文件? –

+0

是的鄧肯,這正是情況。這似乎很奇怪,但我覺得我只是想念一些小事。 – draftalyzer

0

創建版本並將其標記爲當前版本後,您必須在用於添加PersistentStore的選項中添加額外的值,然後再去(我不確定其他iOS版本,但是它肯定會在iOS上使用7)。

-(NSManagedObjectModel *)managedObjectModel 
{ 
    if (managedObjectModel != nil) 
    { 
     return managedObjectModel; 
    } 
    managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; 
    return managedObjectModel; 
} 

-(NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 

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

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"ABC.sqlite"]; 

    NSError *error = nil; 
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] ini tWithManagedObjectModel:[self managedObjectModel]]; 

//Creating Lightweight migration. 
    NSDictionary *options = 
    @{ 
     NSMigratePersistentStoresAutomaticallyOption:@YES 
     ,NSInferMappingModelAutomaticallyOption:@YES 
     ,NSSQLitePragmasOption: @{@"journal_mode": @"DELETE"} 
    }; 


    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) 
    { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 
return persistentStoreCoordinator; 
} 
相關問題