Realm Swift 2.0:“不允许操作”- 仅在设备上

Posted

技术标签:

【中文标题】Realm Swift 2.0:“不允许操作”- 仅在设备上【英文标题】:Realm Swift 2.0: "Operation not permitted" - only on device 【发布时间】:2015-09-07 15:43:39 【问题描述】:

现在我正在从 Swift 1.2 迁移到 Swift 2.0。

我正在进行的项目使用 Realm 作为数据库。 Swift 1.2 在设备和模拟器上一切正常。但是在设备上运行应用程序时,我在 Swift 2.0 中遇到了这个错误:

fatal error: 'try!' expression unexpectedly raised an error: Error
Domain=io.realm Code=1 "open() failed: Operation not permitted"
UserInfo=0x145e2bc0 Error Code=1, NSLocalizedDescription=open() failed:
Operation not permitted: file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-
700.0.57.3/src/swift/stdlib/public/core/ErrorType.swift, line 50

Realm 正在使用此基本路径进行初始化:

NSSearchPathForDirectoriesInDomains(.DocumentDirectory,
      .UserDomainMask, true).first!

即用户文档目录。我可以使用 NSFileManager 访问文件,并在那里实际看到 Realm 文件。

任何线索如何调试这个问题?似乎 Realm 只是在初始化时崩溃。

【问题讨论】:

【参考方案1】:

如果您收到 open() failed 错误,通常情况下,这意味着您提供的路径在某些方面仍然无效。

在这种情况下,我猜您可能没有指定您希望在该 Documents 路径中创建的 Realm 文件的实际文件名。在设置 Realm 文件的路径时(无论是默认路径还是新路径),您必须确保路径是绝对路径,包括文件名。

【讨论】:

你非常接近实际的解决方案:问题是NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first! 在 Swift 1.2 中返回了以 / 结尾的路径,并在 Swift 2.0 中开始返回而不结束 /。在路径中添加/ 解决了这个问题:let documentsDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first! let realmPath = "\(documentsDirectory)/database.realm" 哦,酷!很高兴听到!嗯,如果这只是需要考虑斜杠的情况,我完全建议在这里使用NSString 中的stringByAppendingPathComponent 方法,因为它可以自动解释这些。 :) 祝你好运! 提醒 stringByAppendingPathComponent 已被弃用,继续使用 NSURL。例如,NSURL(string:NSTemporaryDirectory())!.URLByAppendingPathComponent("yourrealm.realm").absoluteString 啊,这可以解释为什么我在任何 Swift 文档中都找不到它。感谢您的提醒!

以上是关于Realm Swift 2.0:“不允许操作”- 仅在设备上的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 应用程序中安装 Realm

使用 Swift 过滤 Realm 对象

带有 Realm 3.4.0 的 .Net Standard 2.0“无法解析引用”Xamarin 表单

在 Swift 中设置 Realm 的位置

Realm (Swift):如何在迁移期间获取 MutableSet 数据?

在同一个项目中同时使用 Realm Swift 和 Realm Objective-C