【问题标题】:What is the perfect use case for using Room.inMemoryDatabaseBuilder()?使用 Room.inMemoryDatabaseBuilder() 的完美用例是什么?
【发布时间】:2019-03-05 06:01:15
【问题描述】:

因此,我正在创建此应用程序,其中包含大量不应保留在设备中的个人信息和数据,以避免出现安全问题。在了解 Room 时,我遇到了这个 Room.inMemoryDatabaseBuilder(),正如文档所述:

为内存数据库创建 RoomDatabase.Builder。当进程被杀死时,存储在内存数据库中的信息会消失。建立数据库后,您应该保留对它的引用并重复使用它。

我想知道这是否适合我的情况。由于数据只会存在于内存中,不会存储在设备中。

这似乎是个好主意。我唯一担心的是我还没有在实际应用程序中看到它的实现。我看到这个Room.inMemoryDatabaseBuilder() 使用的唯一用例是用于测试(因此您不必担心每次测试运行时都会清理数据库)。

谁能给点建议?将不胜感激。

非常感谢。

【问题讨论】:

  • "My only concern is that I haven't seen an implementation of this in an actual application yet." - 实现与由物理文件支持的数据库没有区别
  • @pskink 是的,我明白这一点。我实际上指的是实际用例,而不是实现细节。他们是一样的。也许为了简化,我的问题只是我的想法是否是一个好主意?为什么?
  • 是的,这是个好主意——如果你想保留复杂的数据并对它们执行大量复杂的查询,你总是可以使用大量代码来列出列表/地图等(尤其是当不使用java.util.stream 包),但您可以使用基于内存的房间数据库来代替它
  • 哇!您应该将其发布为答案,以便我可以对其进行标记和投票以供将来参考! :) 只是一个跟进,通过这种方法我还需要照顾一些事情吗?
  • 在普通的 Android 设备上,您的应用程序进程将被随机终止,并且它将丢失存储在内存数据库中的所有数据。对我来说,生产用途听起来不是一个好主意。

标签: android android-room android-architecture-components


【解决方案1】:

我在@Florina Muntenescu 博客here 中发布了同样的上下文问题

她的回答是:

嗨, 是的,它可用于任何需要仅将数据保存在内存中的用例。测试就是其中之一。

所以基本上,Room.inMemoryDatabaseBuilder() 可用于数据只应保存在内存中的其他用例。

【讨论】:

  • 注意Room.inMemoryDatabaseBuilder()不支持加载预打包的数据库。
  • 您好,您在生产中使用过 Room.inMemoryDatabaseBuilder() 吗?你没有任何问题吗?
  • 我并没有真正在产品中使用它...这只是我当时的一些疯狂想法...
【解决方案2】:

Room.inMemoryDatabaseBuilder() 主要用于测试目的。我永远不会在生产中使用它,因为您无法知道进程何时被系统杀死,因此任何超出高级结构化缓存或类似内容的使用都可能不是一个好主意。

我认为您有很多选项可以在不依赖此 API 的情况下解决问题。

您可以使用以下一个或多个选项:

  1. 使用SQLCipher加密房间数据库并将其存储在应用程序私有文件夹中。

  2. 使用Android Keystore 存储私人信息或密码以访问个人信息。

  3. 如果设备使用SafetyNet api 植根,则阻止应用程序的某些敏感部分

  4. 根本不将敏感数据存储在数据库中,而是仅在用户明确请求时才在运行时向服务器请求它们。

【讨论】:

  • 我实际上在这里向@Florina Muntenescu 博客medium.com/mindorks/… 发布了同样的问题。她的回答是“是的,它可以用于任何需要将数据保存在内存中的用例只是。测试就是其中之一。”所以换句话说,它不仅仅是为了测试目的。
  • @ArchieG.Quiñones 我很难相信您需要大量结构化数据来证明数据库的需求,但同时每次用户关闭时都会破坏和重建它应用程序。反应部分可以同时使用带有 LiveData 对象的存储库类来实现。顺便说一下,让我们继续你的想法,看看效果如何。
  • 而且在没有解释的情况下接收 -1 对任何人都没有帮助
  • 我自己并没有真正实现它。这一切都在我的脑海中,我想在尝试做我认为的事情之前有更多的投入,因此进行这次对话确实有帮助。由于""has been designed for testing purposes only.",我对您的答案投了反对票。既然您已经编辑了答案,我将撤回反对票。
  • @MatPag 检查数据库是否存在可以很容易地通过依赖注入来处理。我认为这永远不会成为问题。非常感谢您的投入! :) 我会在我拥有的一些试验项目上进行尝试,也许将来某个时候会回去更新它:) 非常感谢!我喜欢这个社区,因为像你这样的人:D
猜你喜欢
  • 2011-09-06
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 2014-09-06
  • 2011-08-11
  • 2020-09-22
  • 2013-03-12
相关资源
最近更新 更多