要实现备份/恢复功能,我将删除现有的Realm数据库文件,并将其替换为具有相同名称的新数据库文件。但是,在应用程序仍在运行的情况下,它不会看到新数据库文件的内容。如果我退出并重新启动应用程序,它会看到新数据库文件的内容。有没有办法让应用程序看到新内容而不必重新启动它?
答案 0 :(得分:6)
就像从磁盘中删除Realm文件一样,如果您的应用程序当前没有打开Realm文件,则可以安全地替换磁盘上的Realm文件。
来自Realm关于Deleting Realm files的文档:
因为Realm避免将数据复制到内存中,除非绝对需要,所以Realm管理的所有对象都包含对磁盘上文件的引用,并且必须先释放它才能安全删除文件。这包括从Realm,所有
List
,Results
和ThreadSafeReference
对象以及Realm
本身读取(或添加到)的所有对象。实际上,这意味着删除Realm文件应该在应用程序启动之前在打开Realm之前完成,或者仅在显式自动释放池中打开Realm之后完成,这样可以确保所有Realm对象都已经存在解除分配。
原因是Realm维护打开文件的内存缓存,因此尝试打开已打开的文件将导致对已返回的已打开文件的引用。此打开文件将继续引用磁盘上的原始文件,即使它已被替换。确保已清除对Realm访问者对象的所有引用意味着Realm将不会返回现有的打开文件,而是从磁盘中打开该文件。
换句话说,您必须确保在您使用时没有引用Realm的访问者对象(Realm
,Results
,ThreadSafeReference
或Object
实例)尝试替换Realm文件。您还必须确保您所做的任何引用已经被解除分配(即,它们没有在调度队列的默认自动释放池中延迟)。
可能更容易管理的替代方法是在尝试重新打开还原的文件时使用其他路径。由于您正在访问磁盘上的其他路径,因此您将可以保证打开新文件。你仍然需要确保你没有引用Realm的访问者对象,否则你会得到一个奇怪的旧数据和新数据组合,但是确保访问者对象被解除分配并不是那么重要。 / p>