无法在路径上打开一个境界

问题描述 投票:4回答:4

我试图使用一个捆绑的境界文件,但没有成功。我知道我的境界文件已成功复制到我的应用程序的目录中,但我无法读取它。

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!!! :-)

正如文件所建议的那样,我也尝试过直接从捆绑路径打开它,办法是设置: readOnlytrue 在...上 Realm.Configuration 对象。我不知道这是否与Realm有关,还是我忽略了文件系统的一些东西......。我也试过将文件存储在Library文件夹中。

Realm 0.97.0
Xcode Version 7.1.1
ios swift realm
4个回答
2
投票

每当一个低级IO操作被拒绝了对你指定的文件的权限时,这个异常就会被抛出(你可以用 "try!"表达式)。查看 在Realm的GitHub账户上)。)

尽管你的示例代码中的一切似乎都是正确的,但一定是文件位置设置不正确(无论是你的 bundle 的 Realm 文件的文件路径,还是目标路径)导致了该错误。

我可以推荐几件事情试试。

  • 通过断点记录,手动双击检查这两个 fileInDocumentsfileInBundle 正被正确创建,并指向您所期望的位置。

  • 当在模拟器中运行应用程序时,使用类似于 SimPholders 来追踪你的应用程序在电脑上的Documents目录,并直观地确保Realm文件被正确地复制到你所期望的地方。

  • 如果Realm文件在正确的地方,你还可以Realm的 浏览器应用 尝试打开Realm文件,以确保文件被正确复制并仍能正常打开。

  • 尝试在适当的iOS设备上测试代码,看看是否在原生系统上发生同样的错误。

  • 如果一切都失败了,尝试用默认的Realm进行一些Realm操作(这将简单地存入一个 default.realm 文件在你的Documents目录下),只是为了完全不考虑你的文件系统是不是有问题。

让我知道你是怎么做的,如果你还是不能解决这个问题,我们可以继续寻找:)


2
投票

我试着用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文件现在可以在这个路径上打开。


0
投票

根据我发现的情况补充一下解决方案,注意Realm抛出异常时报告的是什么错误,以及传递的错误类型。

截止目前,Realm在这里记录了他们的错误。https:/realm.iodocsobjclatestapiEnumsRLMError.html。

这意味着,你可以发现你的Realm文件是否有权限问题,并根据Realm传递给你的RLMErrorFilePermissionDenied对这些问题做出反应。或者如果文件不存在,用RLMErrorFileNotFound。

我发现最棘手的是当你得到一个更通用的RLMErrorFileAccess时,但这是堆栈溢出上的另一个问题......


0
投票

我也有同样的问题,尝试了太多的方法来解决它。解决这个问题最简单的方法是手动创建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文件。

© www.soinside.com 2019 - 2024. All rights reserved.