我使用 Realm
启动了我的应用程序,因为这在当时似乎是最方便的数据存储方式。
目前这个 Realm 对我来说有两大缺点:
- APK 大小:Realm 库大大增加了 APK 的大小。我目前正在使用 App Bundle 来尽量减少影响,不过,与
SQLite
相比,这是一个问题(我的用例非常简单,不需要高级功能) - 与应用程序包的兼容性:当我开始使用应用程序包来克服上述问题时,另一个出现并且仍然存在:here
因此我想回到普通的SQLite
(可能使用Room
)。
事实是,为了“迁移”,我需要在相当长的一段时间内同时进行这两个操作,以迁移所有现有用户。
计划是:
为
创建数据结构Room
有一个升级机制,将所有 Realm 表填充到
Room
表仅在应用中使用
Room
数据结构发布应用版本 X
在某个时候从应用程序中删除 Realm(只能在 99% 的用户使用 X 版应用程序时完成)
我想没有其他解决办法,或者是否有人已经遇到过同样的问题?
最佳答案
我现在也是这样。
当前想法
我会说您的第 1-5 步计划是从 Realm 到 SQLite 的应用内/本地数据库迁移。它具有关于用户采用正确版本以使数据库迁移为用户工作 (100%) 的所有考虑因素。
我正在考虑另一种选择。 网络服务。 (请耐心等待,因为我还没有实现此解决方案,我仍在考虑/规划阶段)。
如果预算有限,如何设置一个网络服务来代表应用程序进行数据库迁移?
在线数据库迁移
沿着这些线的东西:
- 更新您的应用程序以仅使用 SQLite 运行(删除有关 Realm 的所有内容);
- 您更新后的应用程序会在启动时检测它是否具有 SQLite 数据库;
- 如果未检测到 SQLite 数据库,应用会检查 Realm 数据库;
- 如果找到 Realm 数据库文件,文件将发送到您的网络服务以迁移到 SQLite,然后发送回应用程序并进行相应安装;
- 从新更新的 SQLite 数据库文件恢复;
- 如果未找到 SQLite 和 Realm 数据库文件,则创建 SQLite 作为 Realm 不存在;
注意事项
- 数据传输、托管和处理成本(无服务器/lambda 服务是一种选择?微服务?);
- Web 服务端的并发性(有多少用户同时需要此服务?);
- 用户隐私(是否违反用户隐私、服务条款、隐私政策?);
- 传输和存储的安全性(如果您计划有任何类型的回滚计划);
- Realm 数据库是否加密?怎么处理?
- 我们将用于数据库迁移的 Web 服务保持在线多长时间?
- 如果出现问题,我们是否会在设备上保留 Realm 文件?
- 此任务有任何特定的日志记录要求吗?
- 我们是否需要遵守任何标准或惯例?
结语
如前所述,我还没有实现这样的解决方案,所以我还不能提供关于实用性的见解(如果我按照这条路走,我会更新这个答案)。
我觉得这种在线数据库迁移方法的主要优点是我们从数据库迁移中卸载了应用程序;另一方面,它给已经有风险的任务增加了相当大的复杂性。
最后,我现在能想到的另一种可能性是完全在线迁移数据库,Firebase-ish 或可通过网络 API 访问。但我相信这条路径不符合我可以从你的问题中推断出的场景。
也很想听听社区的意见。
祝你好运。
关于android - 从 Realm 迁移到 Sqlite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55625666/