为了实现备份/还原功能,我将删除现有的领域数据库文件,并将其替换为同名的新数据库文件。但是,由于应用程序仍在运行,它看不到新数据库文件的内容。如果我退出并重新启动应用程序,它会看到新数据库文件的内容。有没有办法让应用程序看到新的内容,而不必重新启动它?
发布于 2017-08-19 16:52:42
就像从磁盘中删除一个领域文件一样,只有在应用程序当前没有打开领域文件的情况下,才能安全地替换磁盘上的领域文件。
来自领域关于删除领域文件的文档
由于领域避免将数据复制到内存中,除非是绝对需要的情况下,由领域管理的所有对象都包含对磁盘上文件的引用,因此必须在安全删除文件之前将其释放。这包括从(或添加到)领域的所有对象、所有
List、Results和ThreadSafeReference对象以及Realm本身。 实际上,这意味着应该在打开领域之前在应用程序启动时或仅在显式自动释放池中打开领域之后删除域文件,这将确保所有领域对象都已被解除分配。
这是因为领域维护一个打开的文件的内存缓存,因此尝试打开已经打开的文件将导致对已经打开的文件的引用被返回。这个打开的文件将继续引用磁盘上的原始文件,即使它已经被替换了。确保清除了对领域访问器对象的所有引用,就意味着王国将不会返回现有的打开文件,而是将从磁盘打开该文件。
换句话说,在尝试替换领域文件时,必须确保没有对领域的访问器对象(Realm、Results、ThreadSafeReference或Object实例)的引用。您还必须确保自那以后已经释放了任何引用(也就是说,它们不会停留在调度队列的默认自动释放池中)。
另一种更容易管理的方法是在尝试重新打开还原的文件时使用不同的路径。由于您正在访问磁盘上的不同路径,因此将保证打开新文件。您仍然需要确保您没有对领域的访问器对象的引用,因为否则您将得到旧的和新的数据的奇怪组合,但是确保释放访问器对象并不那么重要。
https://stackoverflow.com/questions/45772154
复制相似问题