转载博客:http://ju.outofmemory.cn/entry/218012
转载博客:http://blog.csdn.net/jscese/article/details/40016701
相关参考博客:http://www.jianshu.com/p/d224db2b1755
手机数据库保存在data目录下,首先去目录下找到.db文件;
adb访问data目录
一般情况下在真机上是无法进入/data/data 目录的,我们开发的app的一些缓存文件就放在这,像数据库,配置文件,缓存文件,lib等等,有时候我们就想导出数据库等文件,但是没有root的真机,无法进入这个目录。有以下两种方式解决:
方法一
买个专门的开发机,像小米有开发者系统。如果一般的手机必须root
方法二
首先命令行运行(进入adb命令汗终端)
adb shell
然后(不经过data/data/直接进入到自己的开发的项目的包名目录)
run-as com.your.package
然后 (查看自己的apk的包名下的东西)
ls -l
然后将文件拷贝到/sdcard/目录下
cd databases
假设有个叫yourpackagename.db的数据库文件
cat yourpackagename.db> /sdcard/yourpackagename.db
然后用adb pull 导出到电脑。
注意执行这行的时候要,退出adb shell ,也就是在以上命令行中执行,exit
adb pull /sdcard/yourpackagename.db~/
注意:
1.使用run-as后,是无法使用cp命令将应用数据拷贝到sd卡的,没有权限
2.如果apk已经签名,并且设置了android:debuggable=”false”,将无法使用该命令。
3.如果无法使用run-as来直接获取应用数据,可以在自己的应用里实现读取应用数据到sd卡的功能,应用本身对自己的数据是有访问权限的。
4./data/data/com.packagename/lib目录不需要执行run-as就拥有访问权限,为apk间共享so提供了便利
找到数据库就可以使用命令来对它操作了;
sqlite3基本命令操作
一.概念:
sqlite3 为Android所使用的轻量级数据库,小巧方便,用于管理android系统中的各种db文件,在ubuntu中可以安装sqliteman 来查看android系统中的db文件,Framework中的接口位置:/frameworks/base/core/Java/android/database/sqlite/SQLiteDatabase.java
二.shell使用:
我使用的是ubuntu的minicom下的shell终端,以系统setting的database为例,目录为:/data/data/com.android.providers.settings/databases/setting.db
cd 到databases目录下,打开数据库文件:sqlite3 setting.db
SQLite version 3.7.11 2012-03-20 11:35:50
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>
可以看到SQL版本,以及简单提示,使用SQL语句时需要以 “;” 分号结尾!sqlite3 *.db 打开数据库,如果存在就打开操作,如果不存在就创建,修改之后能够保存创建。
使用.help 查看帮助:
.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
.clone NEWDB Clone data into NEWDB from the existing database
.databases List names and files of attached databases
.dbinfo ?DB? Show status information about the database
.dump ?TABLE? ... Dump the database in an SQL text format
If TABLE specified, only dump tables matching
LIKE pattern TABLE.
.echo on|off Turn command echo on or off
.eqp on|off Enable or disable automatic EXPLAIN QUERY PLAN
.exit Exit this program
.explain ?on|off? Turn output mode suitable for EXPLAIN on or off.
With no args, it turns EXPLAIN on.
.fullschema Show schema and the content of sqlite_stat tables
.headers on|off Turn display of headers on or off
.help Show this message
.import FILE TABLE Import data from FILE into TABLE
.indexes ?TABLE? Show names of all indexes
If TABLE specified, only show indexes for tables
matching LIKE pattern TABLE.
.limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT
.log FILE|off Turn logging on or off. FILE can be stderr/stdout
.mode MODE ?TABLE? Set output mode where MODE is one of:
ascii Columns/rows delimited by 0x1F and 0x1E
csv Comma-separated values
column Left-aligned columns. (See .width)
html HTML <table> code
insert SQL insert statements for TABLE
line One value per line
list Values delimited by .separator strings
tabs Tab-separated values
tcl TCL list elements
.nullvalue STRING Use STRING in place of NULL values
.once FILENAME Output for the next SQL command only to FILENAME
.open ?FILENAME? Close existing database and reopen FILENAME
.output ?FILENAME? Send output to FILENAME or stdout
.print STRING... Print literal STRING
.prompt MAIN CONTINUE Replace the standard prompts
.quit Exit this program
.read FILENAME Execute SQL in FILENAME
.restore ?DB? FILE Restore content of DB (default "main") from FILE
.save FILE Write in-memory database into FILE
.scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off
.schema ?TABLE? Show the CREATE statements
If TABLE specified, only show tables matching
LIKE pattern TABLE.
.separator COL ?ROW? Change the column separator and optionally the row
separator for both the output mode and .import
.shell CMD ARGS... Run CMD ARGS... in a system shell
.show Show the current values for various settings
.stats on|off Turn stats on or off
.system CMD ARGS... Run CMD ARGS... in a system shell
.tables ?TABLE? List names of tables
If TABLE specified, only list tables matching
LIKE pattern TABLE.
.timeout MS Try opening locked tables for MS milliseconds
.timer on|off Turn SQL timer on or off
.trace FILE|off Output each SQL statement as it is run
.vfsname ?AUX? Print the name of the VFS stack
.width NUM1 NUM2 ... Set column widths for "column" mode
Negative values right-justify
可以看到所支持的命令,其中常用的:
.database 显示数据库信息;包含当前数据库的位置
.tables 或者 .table 显示表名称 没有表则不显示
.schema 命令可以查看创建数据对象时的SQL命令;
.mode csv|column|insert|line|list|tabs|tcl 改变输出格式
.drop table table_name 删除表
.exit 退出
显示表所有内容: .dump table_name
默认情况,使用 select * from system 查看system表的全部数据:
sqlite> select * from system;
1|volume_music|15
2|volume_ring|5
3|volume_system|7
4|volume_voice|4
5|volume_alarm|6
6|volume_notification|5
7|volume_bluetooth_sco|7
...
可以看到是列表的形式显示出来的,而且ID name value 都是以 “ | ” 分隔开来,分割符号由 .separator "X" 来定义,X即为分割符!
使用 .mode column 之后:
sqlite> .mode column
sqlite> select * from system;
1 volume_music 15
2 volume_ring 5
3 volume_syste 7
4 volume_voice 4
5 volume_alarm 6
6 volume_notif 5
7 volume_bluet 7
其它类似,都只是为了 改变输出的格式而已。
1.创建指令:
sqlite> .schema system
CREATE TABLE system (_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT UNIQUE ON CONFLICT REPLACE,value TEXT);
CREATE INDEX systemIndex1 ON system (name);
创建的时候指定参数和属性,这里有三个,并且自增,关于数据类型:
NULL: 这个值为空值INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8个字节
REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.
TEXT: 文本. 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).
BLOB: 值是BLOB数据,如何输入就如何存储,不改变格式.
2.插入数据:
sqlite> .mode insert
sqlite> select * from system;
INSERT INTO table VALUES(1,'volume_music','15');
INSERT INTO table VALUES(2,'volume_ring','5');
INSERT INTO table VALUES(3,'volume_system','7');
INSERT INTO table VALUES(4,'volume_voice','4');
INSERT INTO table VALUES(5,'volume_alarm','6');
INSERT INTO table VALUES(6,'volume_notification','5');
INSERT INTO table VALUES(7,'volume_bluetooth_sco','7');
如我要在system表里面插入一条数据:
insert into system values('45','sqlite','jscese');
这里插入数据要跟创建的时候数量要对应,不然会报:
Error: table table_name has * columns but * values were supplied3.查询指定数据:
sqlite> select * from system where name='sqlite';
INSERT INTO table VALUES(45,'sqlite','jscese');
根据表类型值来筛选查询,这里表的属性有 _id ,name,value ,可在创建命令中看到!
4.删除数据:
delete from system where value='jscese';
删除整个表: drop table table_name
5.更新表数据:
45|sqlite|jscese
sqlite> update system set name='sqlite3' where value='jscese';
sqlite> select * from system where value='jscese';
45|sqlite3|jscese
6.操作问题:
在使用SQL指令之后没有加 分号就 enter,会进入输入模式,这个时候再补上 一个 ; 分号即可:
sqlite> select * from system
...> ;
我直接在minicom下使用 sqlite 无法识别 上下左右方向键,以及 回退键!
出现 ^[[A ^H 这样的乱码,
网上别人给出的,我没试过~http://ljhzzyx.blog.163.com/blog/static/3838031220102595026789/
本机终端adb shell 是可以识别 回退键的
一般退出sqlite3 使用 .quit