Android短彩信数据库研究

anroid的彩信短信是使用sqlite数据库存储的。要做短彩方面的研发,比如添加,删除,修改,监听等,对数据库的数据表了,字段了,数据了是要有一个比较清楚的了解的。android的厂商众多,而某些的模块的数据库,在一些重大历史版本更新中,也可能会有或多或少的变化,而同时各大厂商在做深度开发时,也往往会对原生态的数据库做一些添加和修改。这给我们开发带来了不少的麻烦。比如前段时间搞的新短信监听,在某些手机上,无法获得,某些手机上,又获得的不对,归根结底是android不同版本的数据库起了变化,而有些厂商为了通信的安全,也修改了数据库。


使用SQLite数据库浏览器,可以十分清楚的了解彩信数库。如下图,打开HTC的短信数据mmssms.db,得到数据表如下:



数据库中有HTC自已订制的数据表。打开sms数据表,如下,可以看到数据表内所有的字段:




消息数据库mmssms.db可以使用命令adbpull /data/data/com.android.providers.telephony/databases/mmssms.db获取,路径/data/data/com.android.providers.telephony/databases/mmssms.db中包括了几乎全部的手机使用到的数据库,如果需要通话或者其他,同样是可以的。


如果你无法使用 adbpull命令,需要先执行下adbremount,如果你连adbremount也不行,大约可能是没有ROOT的原因,有关ROOT,你懂的,不多说。如果确认了手机已经ROOT,adb remount却不能执行,可以试试下面的方法,先进入adbshell,然后:

shell@android:/$ su
shell@android:/ # mount -o rw,remount -t yaffs2/dev/block/mtdblock3 /system
shell@android:/ # chmod 777 /system
shell@android:/system/app # exit
shell@android:/ $ exit


如果adbremount成功了,担adbpull不行,还可以使用 chmod777修改databases,如果仍然无法成功。只能使用必杀技了。首先检查下手机是否ROOT,如果了没有ROOT,先ROOT,如果ROOT了,可以在手机上安装RE管理器,使用这个超级的文件管理工具,把所需要的数据复制到存储卡或者其他可用空间上,然后你懂的,把复制的文件移到电脑上,就可以研究了。


如果把所有的方法都试过了,仍然前路漫漫,困难重重,那就换一以手机试试吧。我觉得判断一个机子是否ROOT成功应该比判断一台机子是不是android智能机更有难度。


如果不巧你无法获得SQLite数据库浏览器,其实如果安装了android的ADK,相应的也会有一个叫sqlite3的命令行程序可以使用。


输入.help可以看到命令列表。

输入sql语句createtable user(username text primary key, password text); 建一张user

输入sql语句insertinto user values("tianyou121", "123"); 插入一个用户。

输入sql语句select* from user; 可以查看user.

输入sql命令是记得结尾的';'号。


下面的代码摘自一个网友的博客,了解开发工具实现的原理,对于学习编程来说,也很有用的。代码摘自http://blog.csdn.net/tianyou121/article/details/6104317


  1#include <stdio.h>
  2 #include <stdlib.h>
 3
  4 #include <sqlite3.h>
  5
  6int myfunc(void *p, int argc, char **argv, char **argvv)
  7{
  8         inti;
  9         *(int*)p = 0;
 10        for(i =0; i < argc; i++)
 11        {
 12                printf("%s = %s ", argvv[i], argv[i] ? argv[i]:"NULL");
 13        }
 14        putchar('/n');
 15        return 0;
 16 }
 17
 18 int main(int argc,char *argv[])
 19 {
 20        sqlite3 *db;
 21        char *err =0;
 22        int ret =0;
 23        int empty =1;
 24
 25        ret = sqlite3_open("student",&db);
 26        if(ret !=SQLITE_OK)
 27        {
 28                fputs("/n",stderr);
 29                exit(1);
 30        }
 31         ret =sqlite3_exec(db, "select * from user;", myfunc, &empty,&err);
 32
 33        if(ret != SQLITE_OK)
 34        {
 35                fputs(err,stderr);
 36                fputs("/n",stderr);
 37                sqlite3_close(db);
 38                exit(1);
 39        }
 40
 41        if(empty)
 42        {
 43                fputs("table student is empty/n",stderr);
 44                exit(1);
 45        }
 46
 47        sqlite3_close(db);
 48
 49        return 0;
 50 }

保存文件为sqlite3_t.c和数据库文件放在一个目录下。
gcc编译:gcc-o sqlite_t sqlite3_t.c -lsqlite3

记得加上-lsqlite3指定库文件,否则编译不通。

./sqlite_t

可以看到user表中用户信息。

可以使用多表联合查询来研究短彩信数据库,甚至修正数据库的错误,我的手机库有些网络彩信显示号码有误,通过联合查询可以比较方便的发现这些错误。

selecttable1.abc from canonical_addresses, where table1.xxx=table2.xxx;



参考:

http://blog.csdn.net/tianyou121/article/details/6104317

http://blog.sina.com.cn/s/blog_74dfa9f401017s69.html


免费短信测试:

http://www.dailysms.us/index.php?on=sms

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值