我们需要在不同的数据库(即领域)之间切换。在特定的文件夹(例如,“ ... / 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/