前言
最近为了方便开发,经常需要查看数据库,但是每次都将db文件导出过程太繁琐,于是便有了这篇文章,但是需要注意的是,我们需要手机的超级用户权限才能查看本地数据库,这里也是一个坑,大家可以自行搜索相关资料。有了超级用户权限后,我们就可以开始下面的操作了。
进入手机数据库
首先,使用adb命令进入到手机系统当中,进入系统后执行su
命令,若此时手机root了在命令窗口就会出现#
号表示,拥有手机有用root权限。
MartindeMacBook-Pro:qmoorassistant martin$ adb shell
vince:/ # su
vince:/ #
获取root权限后,进入到我们数据库存在的目录,一般的规则是/data/data/[app packageName]/database
下,使用ls查看文件,命令展示:
vince:/data/data/com.martin.database/databases # ls
test.db test.db-journal
其中后缀名为journal的文件是日志文件,我们不用管。直接使用sqlite命令去查看数据库,命令展示:
sqlite3 test.db
Enter ".help" for usage hints.
sqlite> .help
.auth ON|OFF Show authorizer callbacks
.backup ?DB? FILE Backup DB (default "main") to FILE
.bail on|off Stop after hitting an error. Default OFF
.binary on|off Turn binary output on or off. Default OFF
我们使用.help
帮助命令,会有很多系统命令,这里我只介绍一些我平常开发中使用的。
sqlite命令的使用
首先进入数据库中,肯定需要查看数据库中的表,命令展示:
sqlite> .table
android_metadata table_schema wxaccount wxmediafile
其中wxaccount
和wxmediafile
是我在项目中创建的表。平时我们在创建表的时候,肯定都给字段定义类型,这里我们可以通过命令查看。
查看表结构
命令:pragma table_info(TABLE_NAME)
sqlite> pragma table_info(wxaccount) ;
0|id|integer|0||1
1|lastmsgid|text|0||0
2|wxuin|text|0||0
显示很容易看,这里就不多解释了。这里的显示格式若不习惯的,sqlite也提供了显示格式命令。
sqlite> .mode line
sqlite> pragma table_info(wxaccount);
cid = 0
name = id
type = integer
notnull = 0
dflt_value =
pk = 1
....
cid = 1
name = test1
type = text
notnull = 0
dflt_value =
pk = 0
这里就会清楚很多,写到这里,我想大家应该很清楚如何进入本地数据库了,下面是我使用sql查看数据的操作,都比较简单,若不敢兴趣可以自行略过。
使用sql命令CURD
sqlite3支持基本的sql命令,sql命令不熟悉的可以去查看这个链接SQL 教程。
查询
- 命令
SELECT column_name,column_name
FROM table_name;
- 用例
sqlite> select * from wxaccount;
id = 1
lastmsgid =
lastoriginalmsgid =
lastthumbmsgid =
wxpassword =
wxuin =
test1 =
模糊查询
- 语法
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern;
- 查询以
.amr
和mp4
结尾的数据
select * from wxmediafile where thumbimgossid like '%.amr';
select * from wxmediafile where bigimgossid like '%.mp4';
插入
INSERT INTO table_name (column1,column2,column3,...) VALUES (value1,value2,value3,...);
- 只插入type=3的数据
INSERT INTO wxmediafile (type) VALUES (3);
修改
- 语法
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;
- 修改wxmediafile的
thumbimgossid
update wxaccount set lastmsgid='' where wxuin='1713258295';
循环修改
- 语法
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...);
- 循环修改
1.首先查询表中以MP3结尾的数据
2.通过id,循环修改thumbimgossid
为空
update wxmediafile set thumbimgossid='' where id IN (select id from wxmediafile where thumbimgossid like '%.mp3');
删除
- delete from [table_name];
delete from wxmediafile
聚合函数
count
-- 查询所有记录的条数
select count(*) from access_log;
-- 查询websites 表中 alexa列中不为空的记录的条数
select count(alexa) from websites;
-- 查询websites表中 country列中不重复的记录条数
select count(distinct country) from websites;
查询数据库中 bigimgossid不为null并且originalFileUploadFlag=0的所有条数;
select count(*) from wxmediafile where bigimgossid IS NOT NULL AND originalFileUploadFlag=0;
查询数据库中 bigimgossid不为null并且originalFileUploadFlag=0的所有条数;
select count(*) from wxmediafile where thumbimgossid IS NOT NULL AND thumbfileuploadflag=0;