【问题标题】:How to recover user data?如何恢复用户数据?
【发布时间】:2023-01-25 04:32:08
【问题描述】:
我的 Android 应用程序使用 SQLite 数据库作为资产。
我在 /assets 目录中提供了一个 .db 文件,以提供只读表和读/写表。
当用户使用应用程序时,它的数据存储在读/写表中。
有时我需要通过在表中添加一列来修改数据库的模式。
所以我需要在发布中提供一个新的 .db 文件。
如果我这样做,问题是用户丢失了他的数据。
当他在他的设备上更新应用程序时,有没有办法导出/导入用户数据?
我没有在网上找到有关此问题的任何信息。
【问题讨论】:
标签:
android
flutter
sqlite
【解决方案1】:
处理这个问题的标准方法是,假设您正在使用(扩展)SQLiteOpenHelper 类是利用版本号和覆盖升级时方法来改变现有数据库的架构,从而保留现有数据。
版本int:数据库编号(从1开始);如果数据库较旧,将使用 onUpgrade(SQLiteDatabase, int, int) 升级数据库;如果数据库较新,onDowngrade(SQLiteDatabase, int, int) 将用于降级数据库
SQLiteOpenHelper(或者如果使用扩展 SQLiteOPenHelper 的 SQliteAssetHelper),在打开数据库时(如果存在)将编码版本号与存储在数据库标头中的版本号进行比较。如果编码版本号大于存储的版本号,则升级时调用传递三个参数的方法,
- SQLite 数据库
- 作为 int 的旧(存储)版本号
- 作为 int 的新(编码)版本号
您通常会检查旧的和新的,并拥有进行更改的代码(ALTER TABLE 或者如果 ALTER TABLE 的限制强制执行某些操作,例如重命名原始表,使用正确的名称创建更改的表,复制现有的数据从原表到新表最后DROP改名后的原表)
如果应用程序是为新用户安装的,那么资产将被复制。从而涵盖这两种情况。
如果不使用 SQLiteOpenHelper 的扩展,那么您可以通过读取偏移量 60 处的 4 个字节并将其与编码版本进行比较或者甚至通过复制资产并获取资产的版本号来模拟使用存储的版本号,这将通过任何方式进行管理您用来维护资产的工具(例如通过user_version PRAGMA)