【问题标题】:Error while migrating persistent store迁移持久存储时出错
【发布时间】: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 error

code:21, '无法打开数据库文件'";

}

UPD

我已经尝试过另一种方式 -

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

设置

[super setFileURL:absoluteURL];

所以托管对象上下文的持久存储已更改,但是当我将一些托管对象添加到上下文并调用时

[_moc save:&error];

错误重复 - 仍然是我之前提到的错误

【问题讨论】:

  • 既然你是为 Mac 写的,它可能与沙盒有关吗?如,您的应用不允许将文件保存在目标目录中?
  • @TomHarrington 我的错,确定我已经启用了对用户选择的文件等的读/写访问权限
  • 有什么建议吗?有人可以帮忙吗?

标签: macos sqlite cocoa core-data


【解决方案1】:

虽然问题很老了, 我试图检查要保存在 CoreData 中的所有内容。似乎在某些时候,当垃圾邮件撤消操作时,系统想要保存带有垃圾字段的对象(但我只有一个用于该对象的构造函数,以防止创建此类字段的值)。试图检测此对象创建的位置,但未成功。所以,我阻止写这个垃圾对象。据我所知,我已经使用了 ManagedObjectContext 的某种 resetPending 选择器,或者类似的东西(不完全是 -[moc reset],它会清除 MOC 中的所有数据,小心)!

【讨论】:

    猜你喜欢
    • 2014-05-11
    • 1970-01-01
    • 2018-04-03
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 2020-09-26
    • 1970-01-01
    相关资源
    最近更新 更多