如何切换数据库?

时间:2016-10-07 14:28:30

标签: swift realm

我们需要在不同的数据库之间切换,即领域。在特定文件夹中有一个活动数据库(例如," ... / 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等),并且应用程序在刷新后仍然显示旧数据。

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

非常感谢你的帮助!

  • 哈迪

1 个答案:

答案 0 :(得分:0)

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

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

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