Realm 惰性查询——它们比 OrmLite 快吗?

Realm lazy queries - are they faster than OrmLite?

我最近阅读了 Realm 数据库的内部文档,他们的所有查询都是惰性的,我不确定,如果我正确理解这可能导致的影响。

让我解释一下我是如何理解的,如果我错了,请随时纠正我。我的看法是,每当我发出这样的命令 mRealm.where(Customer.class).equalTo(Customer.ID, "someId").findFirst(); 时,我都不会得到包含所有填充数据的 Java 对象,该对象包含在该客户的数据库中。相反,每当我尝试访问此 "fetched" 对象的某些字段时,都会进行查询。因此我想知道,如果这比 OrmLite 快,我是否想访问给定 class?

的所有字段

另一个与之相关的问题。对将显示在 ListViewRecyclerView 中的项目使用 Realm 数据库是个好主意吗?如果在滚动列表的过程中不停地查询,对性能的影响不是很大吗?

如果有人能更详细地向我解释这一点,我将非常高兴。

  1. 如果你想知道什么更快,试试吧;)。可能 Realm 会更快,因为他们的专有系统比 SQLite 更优化,甚至是微调。但这是我的假设

  2. 不,它一定不会对性能产生影响,因为我们假设 Realm 足够聪明,可以在适当的时候获取真实数据。使用其他ORM时,也是一样的,分页时取数据

由我们的查询创建的 RealmResults 是自动更新底层数据的视图。您可以将它们视为类型安全的游标,并且它们具有一些相同的权衡,但与 Cursors 不同的是,我们不会将数据复制到 CursorWindow 中,因此没有分页效果。您可以访问整个对象图,而不必担心达到 CursorWindow 限制。

大多数 ORM 将所有数据复制到 Java 堆内存中。这在时间和内存方面都可能是一个非常昂贵的操作+你可能有很多你甚至不需要的额外数据。这样做的好处是你做一次,然后访问数据真的很快。

另一方面,只加载您实际需要的数据。这也包括个别领域。因此,如果您有一个 ListView 显示 10 个项目中的 1 个字段,我们将只加载这 10 个字段,就像 CursorAdapter 一样。它必须从本机内存加载该数据,尽管这比从 Java 堆读取数据更昂贵。

所以回答你的问题。是的,Realm 与 ListView 完美配合。