android - 在 Room 数据库实体上实现 Parcelable 是一种好习惯吗?
问题描述
我正在学习我的 Android 开发技能,并且一直在玩架构组件。因此,我使用注释创建了一个实体类,Room
用于持久化到数据库并Parcelable
在实体类上实现,部分目的是为了将实体对象放入Intent
对象中并在活动/片段之间传递它。我只是想知道这是否是一个好习惯。使用诸如数据库泄漏或安全漏洞之类的方法有什么缺点吗?只是好奇。
解决方案
我只是想知道这是否是一个好习惯。
恕我直言,在现代 Android 应用程序开发中,不,有几个原因,包括:
存储库模式:Android 应用架构中的当前模式是隔离数据存储并将关注点转移到“存储库”对象中。存储库知道数据来自和去往的详细信息(Room、Realm、Retrofit 等)。应用程序的其余部分既不知道也不关心,因为应用程序的其余部分只是与存储库对话。使用这种模式,您将在活动和片段之间传递标识符,并且存储库将根据这些标识符移交模型对象。
隐藏实现细节:你的 UI 应该使用一组理想的模型类,这些模型类不依赖于数据存储或传输的特定实现。这样,如果您选择更改您的实现(例如,从 Room 到 Realm),您的更改将保持孤立,并且对 UI 的影响应该很小。如果您使用存储库,存储库将负责将 Room 实体和 Retrofit 响应转换为应用程序其余部分知道如何使用的标准化模型对象。
单一事实来源:一旦您开始通过
Intent
附加功能传递对象,您就是在制作副本。如果您的应用程序的一部分然后希望修改该模型对象......应用程序的其余部分(持有其他数据副本)将如何知道这些更改?理想情况下,您有一个带有反应式 API 的存储库,其中存储库是进行数据更改的一方。然后,它可以将数据更改通知其他相关方,提供模型对象的最新版本。IPC 内存限制:每次使用
Intent
withstartActivity()
,startActivityForResult()
,setResult()
等时,其内容都会Intent
传递给核心 OS 进程......即使正在启动的活动与请求该活动的代码位于同一进程中开始了。可以有多大的内存限制Intent
(粗略地说,1MB 或更低)。传递完整的模型对象现在可能工作得很好,但以后如果有人Bitmap
向模型添加字段或其他东西,你可能会遇到麻烦。
推荐阅读
- javascript - 是否可以在同一个着色器程序中进行颜色混合和使用照明?
- javascript - javascript中的单词计数器
- c++ - 输出时对齐输入的文本?
- slack - 在 Spinnaker 中配置 Slack 警报
- c - 颠倒句子中单词顺序的问题
- whitespace - 语法 LaTeX,如混合空格 utf 和命令
- objectlistview - 在objectlistview中编辑文本的正确方法是什么
- litho - 无法生成我的应用的 Android App Bundle 版本
- c++ - 为什么它是一个 const 指针而不是指向 const 的指针?
- visual-studio - 用 Visual Studio Code 编写的语言扩展可以在 Visual Studio 2017 中使用吗?