Android研究院之制作第三方数据库与读取(十五)
source link: https://www.xuanyusong.com/archives/199
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Android研究院之制作第三方数据库与读取(十五)
好久都没有更新Android开发系列博文了,不知道大伙还能都记得我这个老朋友,嘿嘿。其实这段时间Android的开发我也一直都没有闲着,Android + IOS + Unity 的游戏与软件开发MOMO都在同时进行,给力的生活还是继续这儿。希望过段时间有机会可以尝试制作一些WP7下的游戏或软件的开发。
Android软件开发中为什么要制作第三方数据库?在程序中获取数据的方式无非就是两种:本地获取,服务器获取。如果项目中的数据非常庞大,并且又不能使用联网获取数据的方式,那么就需要采取制作第三方数据库的方式。我用一个比较实际的例子向大家说明这一点,最近我制作了一个来电归属地查询的小DEMO,产品的需求是对方打过来电话后能再屏幕中现实对方手机号码的归属地。Android提供了联网获取归属地的方式,但是我没有采取这样的方式获取号码归属地。因为联网获取号码归属地时间实在无法控制,有可能用户已经接通电话数据才获取到,那么来电归属地的意义就不存在了。并且联网获取数据还必需是在有网络的情况下,所以限制太多了,所以我放弃的联网获取手机号码归属地的方法。
接着我在网络中找了一份07年手机号码归属地的数据库原始资源。它是以TXT形式包含中国所有省份与城市的号码归属地规则,如下图所示,打开上海所在的归属地文件后。发现归属的规则是截取手机号码前6位判断手机号码所在的归属地。归属地数据库的原始资源包括移动号码与联通号码,加起来一共有61个文本文件。我们需要编写程序这些数据需要全部写入数据库中,然后将生成的数据库文件放入需要查询的新工程中。这么做的原因是归属地数据库的数据量比较大,如果在查询的工程中写入数据库的话至少也要20分钟。这样会造成用户安装完软件后,第一个电话打进来时有可能你的数据库还没写完,用户体验大打折扣。所以我们需要在第三方程序中将这个庞大的数据库先制作出来,然后在放入软件中,最后直接操作这个数据库即可。
07年的数据确实有点老,但是本篇博文的重点不是探讨手机号码归属地。我最终的涉及思路是将.db文件放置在服务器中,服务器端来维护这个db文件,用户首次安装时从服务器下载这个数据库文件,说的有点远了 呵呵。下面学习如何将归属地数据库中庞大的原始数据写入数据库当中,首先需要制作生成数据库的程序。如下图所示,本程序的是方法为点击“开始读取资源写入数据库”按钮后,程序将循环开始在本地读取所有原始资源,截取出需要的数值后在写入归属地数据库当中。
上图对应的Activity是GenerateDBActivity,代码如下所示:
注解1:在窗口中用户点击“读取写入数据库”按钮后,程序将开启一个线程来读取资源,而且代码必需写在线程中读取,因为数据量比较大,主线程中读取会出现ANR的情况。DBHelper.LOCATIONS.Length表示原始数据资源文件的数量,这里使用循环将读取所有原始资源文件。
注解2:loadLocationFile()方法开始读取本地原始资源,原始资源全部放置在res/raw下,使用openRawResource()方法取得每一个原始文件的流对象。然后在while循环中调用br.readLine()方法逐行读取文本对象中的数据,数据读取完毕后将它们写入数据库当中。因为这里是线程,所以需要刷新UI时就得使用Handler了。
注解3:数据库中每插入一条数据库使用handler发来一条消息,在这里获取该消息附带的参数,然后刷新UI将数据现实在屏幕中。
数据库的创建与插入数据的方法写在 DBHelper类当中,代码如下所示:
数据库写入完毕后,然后将生成的数据库从程序中拷贝至本地。如下图所示,将本例程序的location.db文件拷贝至电脑中。
然后使用数据库查看软件,来看一看我们生成的数据库。因为我这里使用的是mac在做开发,所以和以前写用的数据库查看软件有点不一样。如下图所示,本地数据已经写入到数据库当中 , 下面说一下字段的含义:_id为升序具有唯一性 , number 表示号码的前6位字段,city表示号码归属地的城市,location:表示省级的运营商归属地。那么到这一步我们的第三方数据库文件就已经制作完毕。如果有朋友问能不能使用非Android程序生成的数据库,那么我建议最好不要用。或者你将系统生成的表android_metadata与sqlite_sequence表添加进你的数据库试一试,因为这个数据库一定要与Android生成出来的数据库结构一样。否则在部分Android手机上无法打开它db文件的对象。
接着创建一个新android工程,用于我们查询数据库。首先将上面工程中生成的归属地数据库文件location.db拷贝至新工程的raw文件夹中。在如下代码中开始载入数据库中的内容。
注解1:首先将raw文件夹中的数据库文件拷贝至程序内存当中,接着通过拷贝后的路径获取数据库文件的对象。有了数据库对象那么增、删、改、查的操作都可以执行啦。最后的效果图如下所示,输入手机号码后点击查询,下方将现实手机号码的归属地信息。
最后还是老规矩每篇文章都会附带源代码,最后如果你还是觉得我写的不够详细 看的不够爽 不要紧我把源代码的下载地址贴出来 欢迎大家一起讨论学习雨松MOMO希望可以和大家一起进步。
下载地址:http://vdisk.weibo.com/s/aa7gG
(内容包括数据库生成程序与数据库查询程序)
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK