我想恢复我的应用程序内的设置部分的领域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. }
答案 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)")