热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android短彩信数据库研究

P{margin-bottom:0.21cm;}A:link{}anroid的彩信短信是使用sqlite数据库存储的。要做短彩方面的研发,比如添加,删除,修改,监听等,对数据库的数据表了

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
  2 #include
 3
  4 #include
  5
  6int myfunc(void *p, int argc, char **argv, char **argvv)
  7{
  8         inti;
  9         *(int*)p = 0;
 10        for(i =0; 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


推荐阅读
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • MySQL外键1对多问题的解决方法及实例
    本文介绍了解决MySQL外键1对多问题的方法,通过准备数据、创建表和设置外键关联等步骤,实现了用户分组和插入数据的功能。详细介绍了数据准备的过程和外键关联的设置,以及插入数据的示例。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
author-avatar
5257wals_220
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有