我正在尝试使用捆绑的域文件但没有成功。我知道我的领域文件已成功复制到我的应用程序目录但我无法读取它。
致命错误:'试试!'表达意外地引发了一个错误:“无法解决 在路径上打开一个领域 '/Users/.../Library/Developer/CoreSimulator/Devices/.../data/Containers/Data/Application/.../Documents/default-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) }
}
并设置用于默认Realm的配置:
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
答案 0 :(得分:2)
我尝试使用Realm的浏览器应用程序打开领域文件,该文件不再打开。它现在具有新权限:Write only (Dropbox)
。因此,我决定使用文件管理器的setAttributes方法将文件权限更改回read/write
。我是这样做的:
// 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) }
现在可以在此路径中打开领域文件。
答案 1 :(得分:1)
每当低级别I / O操作被拒绝对您指定的文件的权限时,就会抛出该异常(您可以在Realm的GitHub帐户上check it out)。
即使在那里的示例代码中一切看起来都是正确的,也必须使用文件位置(是否是捆绑包的文件路径,即Realm文件或目标路径)错误地设置某些内容导致该错误
我可以推荐一些尝试。
通过断点/记录,手动仔细检查fileInDocuments
和fileInBundle
是否正确创建并指向您期望的位置。
在模拟器中运行应用程序时,使用SimPholders之类的工具在计算机上跟踪应用程序的Documents目录,并直观地确保将Realm文件正确复制到您的位置#39;期待。
如果Realm文件位于正确的位置,您还可以使用Realm的Browser app来尝试打开Realm文件,以确保文件已正确复制并仍可正常打开。
尝试在适当的iOS设备上测试代码,看看原生系统上是否发生了同样的错误。
如果所有其他方法都失败了,请尝试使用默认Realm进行一些Realm操作(这只会在您的Documents目录中存放一个default.realm
文件),只是为了完全折扣没有错误使用您的文件系统
让我知道你如何使用它,如果你仍然无法解决问题,我们可以继续寻找。 :)
答案 2 :(得分:0)
要根据我发现的内容添加到解决方案中,请记下Realm在抛出异常时报告的错误,以及传递的错误类型。
在写作时,Realm在这里记录了他们的错误: https://realm.io/docs/objc/latest/api/Enums/RLMError.html
这意味着您可以了解您的Realm文件是否存在权限问题,并根据Realm传递RLMErrorFilePermissionDenied对这些问题做出反应。或者如果RLMErrorFileNotFound不存在该文件。
我发现的棘手问题是当你得到一个更通用的RLMErrorFileAccess时,那就是Stack Overflow上的另一个问题......
答案 3 :(得分:0)
我遇到了同样的问题,并尝试了多种解决方法。解决此问题的最简单方法是手动创建文件夹XCode不能到达'/ Users /.../ Library / Developer / CoreSimulator / Devices /.../ data / Containers / Data / Application /.../ Documents / ...'在https://docs.realm.io/sync/using-synced-realms/errors#unable-to-open-realm-at-path-less-than-path-greater-than-make_dir-failed-no-such-file-or-directory
创建此文件夹并运行项目后,XCode会自动在此文件夹内创建Realm文件。
答案 4 :(得分:0)
如果您在重新启动应用程序的同时在 Realm Studio 中打开领域文件,则会发生这种情况。基本上在这种情况下,如果 Studio 已经拥有,Realm 将无法获得写入权限。