安卓项目里翻出一个data.db,想看看里面存了什么。装了SQLite Database Browser,打开一片空白,提示file is not a database。折腾半小时才发现,那文件是从应用私有目录直接拷出来的,压根不是SQLite格式,改了个扩展名而已。
它现在叫什么、去哪下
SQLite Database Browser这个名字早就不更新了,项目后来改名DB Browser for SQLite,官网是sqlitebrowser.org。老版本停在3.8左右,新版界面重写过,多了视图和索引的图形编辑。网上搜到的教程里菜单长得不一样的,多数是版本差异,别以为是两个不同软件反复换着装。
拿到文件先做一件事
用十六进制查看器或者记事本看文件开头。正常的SQLite文件前六个字节是SQLite,英文大写,一看就知道。如果开头是别的字符,要么是加密过的库,要么根本不是数据库文件。Android的数据库默认位置在/data/data/应用包名/databases/下面,没有root权限拷不出来,拷出来也常常是权限受限的空文件。调试用的话,可以在代码里把库复制到外部存储,或者用模拟器的设备浏览器导出。
它能做些什么
- 浏览数据:表格视图里翻页、筛选、直接改单元格,改完按Ctrl+S写回。
- 执行SQL:Execute SQL页签里写语句,Ctrl+Return运行,结果集能导出CSV。
- 改结构:加字段、改类型、建索引,图形界面点几下就行,背后自动生成DDL。
- 导入导出:整个库导成.sql文件,或者从CSV导入一张表。
打开就崩溃或数据变乱码
最常见的两个原因,一是库正被程序占用,文件被锁着读写,读到的是中间状态,先把应用停掉或用文件锁工具确认。二是版本太老,新库用了WAL模式,同名的-wal和-shm文件没一起拷,数据只恢复了一部分。三个文件要放同一个目录再打开。中文显示成问号的话,检查表字段的编码,SQLite本身存的是UTF-8。
和命令行比怎么选
sqlite3命令行适合批量处理,.tables看表、.schema看结构、.dump导出,写脚本自动化很方便。图形工具适合临时查数据、给别人演示表结构。两个都装不冲突,但同一个库别同时开着改,容易互相覆盖。
改生产库之前先复制一份到临时目录。它保存时是直接写原文件,没有事务回滚,改错一个值点保存,原数据就没了。