我们需要在不同的数据库(即领域)之间切换。在特定的文件夹(例如,“ ... / database / some.realm”)上有一个活动数据库,并且该数据库可能会更改(例如,更改为“ ... / database / other.realm”)。

我们目前正在做的是:

(1)对于先前的操作数据库:提交所有未清事务并使其无效。

        if realm.inWriteTransaction {
            do {
                try realm.commitWrite()
            } catch {
                ...
            }
        } else {
            ...
        }
        realm.invalidate()


(2)将以前的数据库移到新位置。

(3)将新数据库移至操作位置。

(4)对于新数据库:创建新配置并创建新领域。

public func openDatabaseAtURL(url: NSURL) {
    let config = Realm.Configuration(
        fileURL: url,
        inMemoryIdentifier: nil,
        encryptionKey: nil,
        readOnly: false,
        schemaVersion: self.currentSchemaVersion,
        migrationBlock: nil,
        deleteRealmIfMigrationNeeded: false,
        objectTypes: nil)
    do {
        let realm = try Realm(configuration: config)
        self.realm = realm
    } catch let error as NSError {
        ...
    } catch {
        ...
    }
}


尽管没有错误,并且下次启动该应用程序时正确使用了新数据库,但我们希望数据库开关立即运行。但是,领域似乎没有注意到发生了什么事,因为在该文件夹中,没有创建该领域的其他文件(.lock等),并且该应用程序在刷新后仍显示旧数据。

我们做错了什么,我们应该怎么做呢? (换句话说:我们如何正确地“关闭”旧数据库并“打开”新数据库?)

非常感谢你的帮助!


哈代

最佳答案

Realm在内部跨线程保存对Realm实例的引用,因此不会在每次调用时创建新副本。

不幸的是,实际上这意味着一旦触摸Realm实例,它就会保留在内存中,并会被重新使用,直到系统隐式释放它为止。在此之前,如果将物理文件移动到磁盘上,这将引起问题。

一般建议仅在创建指向Realm文件的任何Realm()实例之前,对Realm文件执行文件操作。但是在其他无法避免的情况下,您可以通过将对Realm的每个调用放在Realm()块中,来明确控制何时清除@autoreleasepool副本。

关于swift - 如何切换数据库?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39919673/

10-13 07:10
查看更多