在我的基於文檔的應用程序中,我遇到了將持久存儲從應用程序內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];
錯誤重複 - 它仍然是我之前提到的相同的錯誤
既然你正在爲Mac寫作,那麼它可能是沙盒相關?如在,您的應用程序不允許保存目標目錄中的文件? –
@TomHarrington我的壞,當然我已經啓用了讀/寫訪問用戶選擇的文件等 – dimazava
所以有什麼建議嗎?誰能幫忙? – dimazava