2017-04-11 73 views
-1

在我的基於文檔的應用程序中,我遇到了將持久存儲從應用程序內Documents文件夾遷移到當前用戶所選文件夾中其他位置的問題。遷移持久存儲時出錯

(代碼簡化)

我的init管理對象上下文這樣

_moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType]; 
[_moc setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy]; 
[_moc setPersistentStoreCoordinator:coordinator]; 
[_moc setUndoManager:[self undoManager]]; 

我使用這些持久性存儲選項

NSInferMappingModelAutomaticallyOption = 1; 
NSMigratePersistentStoresAutomaticallyOption = 1; 
NSSQLitePragmasOption =  { 
    "journal_mode" = DELETE; 
}; 

,創造

store = [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:absoluteURL options:[options copy] error:error]; 

而且升此持久性存儲的ocation是 文件:///Users/currentuser/Library/Containers/com.my.application.osx/Data/Documents/doc1.ext

然後,我填寫了一些喜好

NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; 
[[managedObjectContext undoManager] disableUndoRegistration]; 

NSEntityDescription *description = [NSEntityDescription entityForName:entityName inManagedObjectContext:context]; 

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
request.entity = description; 
NSError *error = nil; 
NSArray *results = [context executeFetchRequest:request error:&error]; 

Settings *file = nil; 

if (error == nil) { 
    if ([results count]>0) { 
     file = [results firstObject]; 
    } else { 
     file = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:context]; 

    } 
    [Settings setEntityFromUserDefaults:&file]; 
} 
_fileSettings = file; 
[managedObjectContext processPendingChanges]; 
[[managedObjectContext undoManager] enableUndoRegistration]; 
[self syncFileModificationDate]; 

最後,當我嘗試執行此操作

NSPersistentStoreCoordinator *coordinator = [self.managedObjectContext persistentStoreCoordinator]; 
[coordinator migratePersistentStore:[coordinator.persistentStores firstObject] toURL:absoluteURL options:[coordinator.persistentStores firstObject].options withType:NSSQLiteStoreType error:&error2]; 

我什麼,我在調試控制檯中看到

2017-04-11 18:09:32.336 Project [36495:4118531] CoreData: error: (21) I/O error for database at /Users/dzawadsky/Documents/tmp author docs/doc1.ext. SQLite error code:21, 'unable to open database file'

2017-04-11 18:24:42.980 Project [36495:4118531] CoreData: error: - -addPersistentStoreWithType:SQLite configuration:PF_DEFAULT_CONFIGURATION_NAME URL:file:///Users/dzawadsky/Documents/tmp%20author%20docs/doc1.ext options:{

NSInferMappingModelAutomaticallyOption = 1; 

NSMigratePersistentStoresAutomaticallyOption = 1; 

NSPersistentStoreRemoveUbiquitousMetadataOption = 1; 

NSSQLitePragmasOption =  { 
    "journal_mode" = DELETE; 
}; 

} ... returned error Error Domain=NSCocoaErrorDomain Code=21 "(null)"

UserInfo={NSSQLiteErrorDomain=21, NSUnderlyingException=I/O error for database at /Users/currentuser/Documents/tmp author docs/doc1.ext. SQLite error code:21, 'unable to open database file'} with userInfo dictionary {

NSSQLiteErrorDomain = 21; 

NSUnderlyingException = "I/O error for database at /Users/currentuser/Documents/tmp author docs/doc1.ext. SQLite error 

code:21, 'unable to open database file'";

}

UPD

我已經試着走另一條路 -

[fileManager copyItemAtURL:itemAtURL toURL:absoluteURL error:&error2]; 

,並設置

[super setFileURL:absoluteURL]; 

所以管理對象範圍內的持久性存儲已被更改,但是當我加入一些管理對象的上下文和呼叫

[_moc save:&error]; 

錯誤重複 - 它仍然是我之前提到的相同的錯誤

+0

既然你正在爲Mac寫作,那麼它可能是沙盒相關?如在,您的應用程序不允許保存目標目錄中的文件? –

+0

@TomHarrington我的壞,當然我已經啓用了讀/寫訪問用戶選擇的文件等 – dimazava

+0

所以有什麼建議嗎?誰能幫忙? – dimazava

回答

1

雖然問題是相當老, 我試圖檢查所有想要保存在CoreData中。看起來,在某些時候,雖然垃圾郵件撤消操作,但系統想要用垃圾字段保存對象(但我只有一個構造函數用於此對象,這可以防止創建此類字段的值)。試圖檢測這個對象創建的地方,但不成功。所以,我阻止寫這個垃圾對象。我記得使用了某種類型的ManagedObjectContext的resetPending選擇器,或者像這樣(不完全 - [moc reset]),它會清除MOC中的所有數據,小心)!