【问题标题】:Where should I place my default.realm database file?我应该将我的 default.realm 数据库文件放在哪里?
【发布时间】:2021-08-19 07:24:54
【问题描述】:

我目前在项目目录中的文件夹 assets 中有我的 default.realm 文件。当我在设备上运行我的应用程序时,出现以下权限错误,这不在模拟器上

Thread 1: Fatal error: 'try!' expression unexpectedly raised an 
error: Error 
Domain=io.realm Code=2"Unable to open a realm at path 
'/private/var/containers/Bundle/Application/BD313F74-303C-4A58- 
9CA9- 
6FF5C6851A3B/AXIMATOR.app/default.realm.lock': open() failed: Operation not 
permittedPath: /private/var/containers/Bundle/Application/BD313F74-303C-4A58-9CA9- 
6FF5C6851A3B/AXIMATOR.app/default.realm.lock

这是我的领域初始化

let docDir = try! FileManager.default.url(for: .documentDirectory, in: 
.userDomainMask, appropriateFor: nil, create: true)
let realmUrl = Bundle.main.url(forResource: "default", withExtension: "realm")
let config = Realm.Configuration(fileURL: realmUrl)
let realm = try! Realm(configuration: config)

我已将 default.realm 文件复制到 .documentDirectory,但我仍然在下面遇到权限错误

Thread 1: Fatal error: 'try!' expression unexpectedly raised an 
error: Error Domain=io.realm Code=2 "Unable to open a realm at 
path '/var/mobile/Containers/Data/Application/2445658F-A925-48B9- 
AA04-6568FC8AC7C9/Documents.lock': open() failed: Operation not 
permitted Path: /var/mobile/Containers/Data/Application/2445658F- 
A925-48B9-AA04-6568FC8AC7C9/Documents.lock

放置我的领域文件的理想位置是什么?我已经有一个现成的领域文件

【问题讨论】:

  • @Sweeper 我的领域文件已经包含数据,所以我目前将它放在我的项目文件夹中并收到上述错误。我试过复制它like these,但错误仍然存​​在
  • 还包括您尝试过的新代码和新的错误消息!
  • 你把它放在哪里取决于你想用它做什么;默认位置通常是最好的主意,那么为什么要将它移到其他地方呢?看起来您还试图包含一个捆绑的领域,如果是这种情况,它将是只读的并且将存在于应用程序包中,因此您不需要将它放在任何地方,因为它将是项目的一部分。你能澄清一下这个问题吗?

标签: swift database realm


【解决方案1】:

我设法使用 fileURL 而不是 configuration 参数解决了这个问题

let realm  = try! Realm(fileURL: inDocumentDirectory(fileName: "default.realm"))

函数inDocumentDirectory()是用来加载文件URL的

func inDocumentDirectory(fileName: String) -> URL {
    
    return URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0], isDirectory: true)
        .appendingPathComponent(fileName)
}

这适用于当您使用应用程序发送预捆绑数据时,因为捆绑数据是只读的,您无法修改它,如果您想修改该数据,您需要将该数据移动到某个可写位置。您可以使用下面的方法复制您的预捆绑领域文件,您可以通过添加文件存在检查进行优化,以便仅在第一次复制时复制

func copyFilesFromBundleToDocumentsFolderWith(fileExtension: String) {
    if let resPath = Bundle.main.resourcePath {
        do {
            let dirContents = try FileManager.default.contentsOfDirectory(atPath: resPath)
            let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
            let filteredFiles = dirContents.filter{ $0.contains(fileExtension)}
            for fileName in filteredFiles {
                if let documentsURL = documentsURL {
                    let sourceURL = Bundle.main.bundleURL.appendingPathComponent(fileName)
                    let destURL = documentsURL.appendingPathComponent(fileName)
                    do {
                        try FileManager.default.copyItem(at: sourceURL, to: destURL)
                    } catch CocoaError.fileNoSuchFile {
                        print("name, No such file")
                    } catch let error {
                        // other errors
                        print("name: \(error.localizedDescription)")
                    }
                }
            }
        } catch { }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2018-09-28
    • 2019-10-04
    相关资源
    最近更新 更多