在应用程序运行时replaceRealm文件

为了实现备份/恢复function,我删除了现有的Realm数据库文件,并将其replace为具有相同名称的新数据库文件。 但是,应用程序仍在运行,它不会看到新的数据库文件的内容。 如果我退出并重新启动应用程序,它会看到新数据库文件的内容。 有没有办法让应用程序看到新的内容,而无需重新启动?

就像从磁盘上删除一个Realm文件一样,如果您的应用程序当前没有打开Realm文件,则只能replace磁盘上的Realm文件。

从Realm关于删除领域文件的文档:

由于Realm避免将数据复制到内存中,除非绝对需要,由Realmpipe理的所有对象都包含对磁盘上文件的引用,并且必须先解除分配才能安全删除该文件。 这包括从Realm,所有ListResultsThreadSafeReference对象读取(或添加到) Realm本身的所有对象。

实际上,这意味着删除一个Realm文件应该在应用程序启动之前打开Realm,或者在一个明确的自动释放池中打开Realm之后完成,这将确保所有的Realm对象都被释放。

原因是Realm维护一个打开文件的内存caching,所以试图打开一个已经打开的文件将导致对已经打开的文件被返回的引用。 这个打开的文件将继续引用磁盘上的原始文件,即使它已被replace。 确保已经清除了对Realm访问器对象的所有引用,意味着Realm将不会有一个现有的打开的文件返回,而是从磁盘打开文件。

换句话说,在尝试replaceRealm文件时,您必须确保没有对Realm的访问器对象( RealmResultsThreadSafeReferenceObject实例)的引用。 您还必须确保您已经释放的任何引用已经被释放(即,它们没有留在分派队列的默认自动释放池中)。

另一种可能更容易pipe理的方法是在尝试重新打开还原的文件时使用不同的path。 由于您正在磁盘上访问不同的path,因此您将保证打开新文件。 你仍然需要确保你没有引用Realm的访问对象,否则你会得到一个奇怪的旧的和新的数据组合,但它不会像确保访问对象被释放一样重要。