【发布时间】:2017-09-07 02:22:59
【问题描述】:
在我的基于文档的应用程序中,我在将持久性存储从应用内文档文件夹迁移到当前用户选择的文件夹中的其他位置时遇到了一些问题。
(代码已简化)
我像这样初始化托管对象上下文
_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];
这个持久存储的位置是 file:///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 项目 [36495:4118531] CoreData: 错误:(21)/Users/dzawadsky/Documents/tmp 处的数据库 I/O 错误 作者 docs/doc1.ext。 SQLite 错误代码:21,'无法打开 数据库文件'
2017-04-11 18:24:42.980 项目 [36495:4118531] CoreData:错误:- -addPersistentStoreWithType:SQLite 配置:PF_DEFAULT_CONFIGURATION_NAME 网址:file:///Users/dzawadsky/Documents/tmp%20author%20docs/doc1.ext 选项:{
NSInferMappingModelAutomaticallyOption = 1; NSMigratePersistentStoresAutomaticallyOption = 1; NSPersistentStoreRemoveUbiquitousMetadataOption = 1; NSSQLitePragmasOption = { "journal_mode" = DELETE; };} ... 返回错误 Error Domain=NSCocoaErrorDomain Code=21 "(null)"
UserInfo={NSSQLiteErrorDomain=21, NSUnderlyingException=I/O /Users/currentuser/Documents/tmp author 处的数据库错误 docs/doc1.ext。 SQLite 错误代码:21,'无法打开数据库 文件'} 与 userInfo 字典 {
NSSQLiteErrorDomain = 21; NSUnderlyingException = "I/O error for database at /Users/currentuser/Documents/tmp author docs/doc1.ext. SQLite errorcode:21, '无法打开数据库文件'";
}
UPD
我已经尝试过另一种方式 -
[fileManager copyItemAtURL:itemAtURL toURL:absoluteURL error:&error2];
设置
[super setFileURL:absoluteURL];
所以托管对象上下文的持久存储已更改,但是当我将一些托管对象添加到上下文并调用时
[_moc save:&error];
错误重复 - 仍然是我之前提到的错误
【问题讨论】:
-
既然你是为 Mac 写的,它可能与沙盒有关吗?如,您的应用不允许将文件保存在目标目录中?
-
@TomHarrington 我的错,确定我已经启用了对用户选择的文件等的读/写访问权限
-
有什么建议吗?有人可以帮忙吗?
标签: macos sqlite cocoa core-data