我们需要在不同的数据库之间切换,即领域。在特定文件夹中有一个活动数据库(例如," ... / 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等),并且应用程序在刷新后仍然显示旧数据。
我们做错了什么,我们应该做些什么呢? (换句话说:我们如何正确地"关闭"旧数据库和"打开"新数据库?)
非常感谢你的帮助!
答案 0 :(得分:0)
Realm在内部持有对线程Realm
实例的引用,因此每次调用时都不会创建新副本。
不幸的是,这在实践中意味着一旦触及Realm
实例,它将保留在内存中并将被重复使用,直到系统隐式释放它为止。在此之前,如果您在磁盘上移动物理文件,这将导致问题。
一般建议仅在创建指向它的任何Realm()
实例之前,对Realm文件执行文件操作。但是在其他情况下,您无法避免这种情况,您可以通过将Realm
的每个调用放在Realm()
块中来明确控制@autoreleasepool
副本被驱逐的时间。