2017-04-11 103 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中的所有数据,小心)!