为了将一个 Android App 由 Room 迁移到 SQLDelight 方案,首先需要了解既有 app 的表结构。
使用 Android Studio 自带的 App Inspection 将 Room 创建的 SQLite 数据库导出为 db 文件, 如 item_database.db。
打开 db 文件
使用 sqlite3 命令连上数据库文件,查看具体表的建表语句
sqlite3 item_database.db
注意是 sqlite3,而不是 sqlite.
否则会报错:
> sqlite item_database.db
Unable to open database "item_database.db": file is encrypted or is not a database
查看建表语句命令
> .schema items
CREATE TABLE `items` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `num` INTEGER);
这个就类似于 mysql 的 show create table 语句的作用。
是否加密
一开始我用错了 sqlite 命令,看提示,我以为 Room 生成的 SQLite 文件是加密过的。
实际上并不是加密的。可以放心从 Room 迁移到 SQLDelight 方案了。
shm 与 wal 文件
从 Android Studio App Inspection 导出的 sqlite 文件,除了 db 文件,还有:
- item_database-shm*
- item_database-wal*
- item_database.db
一共三个文件。
shm 和 wal 都是 SQLite 数据库文件的附属文件, 支持其运行时环境。
- shm 文件是 SQLite 的共享内存文件,用于多线程访问数据库时进行进程间通信和数据共享。
- wal 文件是 SQLite 的 Write-Ahead Logging(预写式日志)文件,用于记录数据库文件的变更。
在 SQLite 数据库中,当执行 INSERT、UPDATE、DELETE 等修改语句时,这些变更会首先被写入到WAL文件中。同时,SQLite 也会维护一个缓存区,将这些变更保存在内存中,直到达到一定条件后才会将其同步到数据库文件中。当 WAL 文件的大小达到一定限制后,SQLite 会将 WAL 文件合并到数据库文件中,并清空 WAL 文件,以供下一次变更使用。因此,WAL 文件可以保证在发生意外断电等异常情况时不会损坏原始的数据库文件。
探索更多关于 SQLDelight
📖 Android Room 替代品 SQLDelight 中文入门教程
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式