在 Swift 中设置 Realm 的位置

Posted

技术标签:

【中文标题】在 Swift 中设置 Realm 的位置【英文标题】:Setting location of Realm in Swift 【发布时间】:2019-06-27 18:13:01 【问题描述】:

我已阅读 Realm 文档并使用 this answer 尝试将 Realm 的位置设置为 Application Support 文件夹而不是 Documents 文件夹。

我的应用程序需要从 Documents 文件夹中导出一个文件,因此我也无法让用户看到其中的领域内容。

我正在使用此代码:

var config = Realm.Configuration()

    config.fileURL = (FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first)

    // set the location
    Realm.Configuration.defaultConfiguration = config
    print (Realm.Configuration.defaultConfiguration.fileURL!)

... 试图将领域及其所有文件等放在 applicationSupportDirectory 但它根本不起作用,除了当我打印出位置时,它会在这样的位置末尾附加应用程序支持位。 ..

.../Application/964D53C2-C880-4144-B5F0-688213820A67/Library/Application%20Support

这是没用的。

我尝试寻找一个关于如何在 Swift 4 中实际指定领域位置的简单指南,但除了我列出的答案之外找不到任何其他内容。我在这里做错了什么?

【问题讨论】:

【参考方案1】:

试试这个代码测试和工作。我们需要创建应用程序支持目录,默认情况下它没有创建。

    let fileManager = FileManager.default
    var config = Realm.Configuration()

    let urls = fileManager.urls(for: .applicationSupportDirectory, in: .userDomainMask)

    if let applicationSupportURL = urls.last 
        do 
            try fileManager.createDirectory(at: applicationSupportURL, withIntermediateDirectories: true, attributes: nil)
            config.fileURL = applicationSupportURL.appendingPathComponent("demo.realm")
         catch let err 
            print(err)

        
    

    // Set this as the configuration used for the default Realm
    Realm.Configuration.defaultConfiguration = config

    print (Realm.Configuration.defaultConfiguration.fileURL!)

【讨论】:

这仍然在 Docs 目录中创建一个随机文件 - 我有另一个关于这个问题的问题 ***.com/questions/56825173/… 当你这样做时,它是否也在docs目录中创建了一个文件? 不,对我来说,没有在文档目录中创建任何内容,所有内容都在应用程序支持文件夹中【参考方案2】:

问题是您将一个 url 传递给一个目录,但它似乎期望一个文件的 url。根据docs,您应该可以做到这一点。

config.fileURL = FileManager.default
    .urls(for: .applicationSupportDirectory, in: .userDomainMask)
    .first
    .appendingPathComponent("default.realm")

【讨论】:

嘿,感谢您的帮助 - 不幸的是,这需要解开 .first 并且还会导致 Xcode 和模拟器在启动时崩溃!【参考方案3】:

我的版本

// File Manager
let fileManager = FileManager.default

do 
    // Document directory URL
    let documentsDirectory = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
    
    // Create App folder
    try fileManager.createDirectory(at: documentsDirectory.appendingPathComponent("app.folder/"), withIntermediateDirectories: true, attributes: nil)

 catch 
    print("Catch error")


// Configuring a Local Realm
var config = Realm.Configuration()

// Use the default directory, but add the app folder with the default realm file
config.fileURL = config.fileURL?.deletingLastPathComponent().appendingPathComponent("app.folder/default.realm")

// Set this as the configuration used for the default Realm
Realm.Configuration.defaultConfiguration = config

// Now print default Realm data base url
print(Realm.Configuration.defaultConfiguration.fileURL!)
        

【讨论】:

以上是关于在 Swift 中设置 Realm 的位置的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 2 Xcode 7 Beta 4 中设置基于位置的提醒时出错

在 Tableview (Swift) 中设置静态位置视图

如何在 Realm 中设置自动增量键?

如何在 Realm 中设置 NSPredicate 以找到 totalPrice > X?

Swift 在情节提要中设置 UIButton setBorderColor

在 Swift 2.0 中设置 UINavigationController 栏标题