我试图使用一个捆绑的境界文件,但没有成功。我知道我的境界文件已成功复制到我的应用程序的目录中,但我无法读取它。
fatal error: 'try!' 表达式意外地引发了一个错误。"无法打开路径'Users...LibraryDeveloperCoreSimulatorDevices...dataContainersDataApplication...Documentsdefault-v1.realm'的境界。 请使用你的应用有读写权限的路径。"
func fullPathToFileInAppDocumentsDir(fileName: String) -> String {
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,NSSearchPathDomainMask.UserDomainMask,true)
let documentsDirectory = paths[0] as NSString
let fullPathToTheFile = documentsDirectory.stringByAppendingPathComponent(fileName)
return fullPathToTheFile
}
在 didFinishLaunchingWithOptions
:
let fileInDocuments = fullPathToFileInAppDocumentsDir("default-v1.realm")
if !NSFileManager.defaultManager().fileExistsAtPath(fileInDocuments) {
let bundle = NSBundle.mainBundle()
let fileInBundle = bundle.pathForResource("default-v1", ofType: "realm")
let fileManager = NSFileManager.defaultManager()
do {
try fileManager.copyItemAtPath(fileInBundle!, toPath: fileInDocuments)
} catch { print(error) }
}
并设置默认境界使用的配置。
var config = Realm.Configuration()
config.path = fileInDocuments
Realm.Configuration.defaultConfiguration = config
let realm = try! Realm(configuration: config) // It fails here!!! :-)
正如文件所建议的那样,我也尝试过直接从捆绑路径打开它,办法是设置: readOnly
到 true
在...上 Realm.Configuration
对象。我不知道这是否与Realm有关,还是我忽略了文件系统的一些东西......。我也试过将文件存储在Library文件夹中。
Realm 0.97.0
Xcode Version 7.1.1
每当一个低级IO操作被拒绝了对你指定的文件的权限时,这个异常就会被抛出(你可以用 "try!"表达式)。查看 在Realm的GitHub账户上)。)
尽管你的示例代码中的一切似乎都是正确的,但一定是文件位置设置不正确(无论是你的 bundle 的 Realm 文件的文件路径,还是目标路径)导致了该错误。
我可以推荐几件事情试试。
通过断点记录,手动双击检查这两个 fileInDocuments
和 fileInBundle
正被正确创建,并指向您所期望的位置。
当在模拟器中运行应用程序时,使用类似于 SimPholders 来追踪你的应用程序在电脑上的Documents目录,并直观地确保Realm文件被正确地复制到你所期望的地方。
如果Realm文件在正确的地方,你还可以Realm的 浏览器应用 尝试打开Realm文件,以确保文件被正确复制并仍能正常打开。
尝试在适当的iOS设备上测试代码,看看是否在原生系统上发生同样的错误。
如果一切都失败了,尝试用默认的Realm进行一些Realm操作(这将简单地存入一个 default.realm
文件在你的Documents目录下),只是为了完全不考虑你的文件系统是不是有问题。
让我知道你是怎么做的,如果你还是不能解决这个问题,我们可以继续寻找:)
我试着用Realm的浏览器应用打开境界文件,文件再也打不开了。它现在有了新的权限。Write only (Dropbox)
. 所以,我决定把文件的权限改回为 read/write
使用文件管理器的 setAttributes 方法。我是这样做的。
// rw rw r : Attention for octal-literal in Swift "0o".
let permission = NSNumber(short: 0o664)
do {
try fileManager.setAttributes([NSFilePosixPermissions:permission], ofItemAtPath: fileInDocuments)
} catch { print(error) }
Realm文件现在可以在这个路径上打开。
根据我发现的情况补充一下解决方案,注意Realm抛出异常时报告的是什么错误,以及传递的错误类型。
截止目前,Realm在这里记录了他们的错误。https:/realm.iodocsobjclatestapiEnumsRLMError.html。
这意味着,你可以发现你的Realm文件是否有权限问题,并根据Realm传递给你的RLMErrorFilePermissionDenied对这些问题做出反应。或者如果文件不存在,用RLMErrorFileNotFound。
我发现最棘手的是当你得到一个更通用的RLMErrorFileAccess时,但这是堆栈溢出上的另一个问题......
我也有同样的问题,尝试了太多的方法来解决它。解决这个问题最简单的方法是手动创建XCode无法到达的文件夹'Users...LibraryDeveloperCoreSimulatorDevices...dataContainersDataApplication...Documents...',如以下解释 https:/docs.realm.iosyncusing-synced-realmserrors#unable-to-open-realm-at-path-less-than-path-greater-than-make_dir-failed-no-such-file-or-directory。
一旦你创建了这个文件夹并运行项目,XCode就会自动在这个文件夹内创建Realm文件。