在我的基于文档的应用程序中,我遇到了将持久存储从应用程序内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