Swift Realm:如何在不重启app的情况下在同一路径上替换数据库

时间:2017-04-19 09:35:02

标签: ios swift realm restore

我想恢复我的应用程序内的设置部分的领域swift数据库。我可以使用FileManager为.realm文件创建和列出备份。但是,当我删除当前的realm文件,然后将另一个realm文件复制到原始域文件位置时,我的应用程序不知道文件内容已更改。

事实上,即使我删除了原始的realm文件,并且没有用任何东西替换它,我的应用程序仍能正常运行。

我调试了源代码,我认为问题是Realm总是根据URL返回缓存版本。即使Url不再有效,它仍会返回缓存的域。

如果有任何方法强制重置缓存以便我可以替换领域文件?似乎Objc允许它,但不是在Swift中?

或者是否有某些我错过的强烈参考?

以下是删除领域文件但仍然可以访问它的代码片段:


    try! Realm().write {
        // A bunch of adds
    }
    let curURL = Realm.Configuration.defaultConfiguration.fileURL!
    try! FileManager.default.removeItem(at: curURL)

    // Just sample code to make sure things are all cleaned up
    autoreleasepool {
        let realm = try! Realm(fileURL: curURL) // works
        let results = realm.objects(Email.self) // results are from the realm before I delete the file.
    }

1 个答案:

答案 0 :(得分:0)

嗯,我认为这真的是我所看到的自动释放问题。如果我像下面这样包装我的代码,那么数据库将被正确删除。

这意味着我真的必须在我的应用程序中搜索所有引用...

class Email: Object {
    dynamic var subject = ""
    dynamic var id = UUID().uuidString

    override static func primaryKey() -> String? {
        return "id"
    }
}

autoreleasepool {
    print("\(try! Realm().configuration.fileURL!.path)")

    try! Realm().write {
        try! Realm().deleteAll()
    }

    try! Realm().write {
        try! Realm().add(Email(value: ["subject": "Hello"]))
        try! Realm().add(Email(value: ["subject": "World"]))
        try! Realm().add(Email(value: ["subject": "Is"]))
        try! Realm().add(Email(value: ["subject": "Good"]))
    }

    var result = try! Realm().objects(Email.self)
    print("\(result.count)")

    try! FileManager.default.removeItem(at: Realm.Configuration.defaultConfiguration.fileURL!)

    var newResult = try! Realm().objects(Email.self)
    print("\(newResult.count)")

}

var newResult = try! Realm().objects(Email.self)
print("\(newResult.count)")