我该什么时候应该调用realm.close()?

时间:2016-11-14 11:21:21

标签: react-native realm

我正在使用Realm作为我的React Native应用程序。我正在为我的组件提供Realm实例,如官方example app

所示

export default new Realm({schema: [Todo, TodoList]});

当我随后用Jest进行测试时,我意识到只要我不打电话,这个过程就没有完成

afterAll(() => { realm.close(); });

在测试套件的末尾。

这使我想到是否以及何时应该在生产代码中调用realm.close()。没有打电话给关闭有什么后果?如果推荐,关闭Realm实例的最佳方法是什么?

2 个答案:

答案 0 :(得分:6)

完成当前架构后,将使用

realm.close()。在Realm api页面中,它说明如下:

  

close():关闭此Realm,以便可以使用较新的架构版本重新打开它。调用此方法后,此Realm中的所有对象和集合都不再有效。

如果您不想更改架构,则不必担心close方法。

此处完整参考:Realm close method

答案 1 :(得分:1)

一些好的,直接的参考文献:

Realm实例是引用计数的-如果您在线程中两次调用getInstance,则也需要两次调用close。这使您可以实现Runnable类,而不必担心哪个线程将执行它们:只需以getInstance开始并以close结束。

在执行事务时(通常在后台线程中):

  1. 获取一个Realm实例
  2. 用于executeTransaction
  3. 然后,之后close()立即

例如:

Realm.getDefaultInstance()

    // use will close realm after the transaction is finished/failed
    .use { realm ->

        // DO NOT execute read/write operations outside of a transaction...
        // because it will lead to stale reads, exceptions, and other problems

        realm.executeTransaction { realm ->
            // do things in the transaction (both reading & writing)
        }
    }

在主/ UI /循环器/处理程序线程上,保持Realm的实例处于打开状态,因为您通常想听听从{{1 }}实例:

  1. 在可见的应用程序中创建/获取一个RealmResults实例
  2. 实例由主线程上执行的所有操作(通常为读取操作)共享
  3. 在应用程序关闭时,共享实例为Realm d。

例如:

Realm