一种轻量本地归属地查询的方法

我们的安卓客户端里头需要加一个归属地显示的功能,要对比较多的号码进行归属地显示,实时查询还是慢了点,而且还要流量,只能通过本地数据库来查询。

做客户端的同事找了找资料,结果说不是人家的代码不开源就是数据文件格式不开放,无法自己生成,而且人家的数据文件也不小;如果直接把数据都放到安卓的SQLite数据库里头的话也很大,好几MB,而且查询起来也很慢,根本不可用。

于是俺就说那行吧,既然这样那就直接直接弄吧,手机号段都是连续的,这个可以利用一下。

首先假定有这样一些归属地的数据:

编号

区号

归属地

1

010

北京市

2

0311

河北省石家庄市

全国一共大概应该有300多区号吧,这些数据可以放在一张表里头,这样先解决了固话归属地的问题,查起来速度应该也很快的。

然后再看手机的,比如说130这个号段的,1300000这个号段是北京的,1300311这个号段是石家庄的,那么就有一个叫130的二进制文件,每两个字节对应一个归属地的编号,也就是说130这个文件第0000个字节和0001个字节读出来转成一个int之后的值为1,然后去归属地表里查就可以知道是北京市;读第0311*2和0312*2+1个字节之后的值就是2,查出来归属地是石家庄的。这样的话每个手机归属地需要读一次文件和查一次数据库,但是读文件的时候是直接知道文件位移的,应该很快;数据库量小,查起来也很快,所以速度是有保障的。

再看数据文件大小,130有10000个号段,每个号段占2B,也就是说一共有20KB,全国13、15、18开头的三位数号段最多也就是30个,也就是说数据文件最多30个,大小最多600KB,再加上号段本来大部分是连续的,打包的时候可以压缩一下,估计可压缩率还是挺高的,压缩到100K以下都是有可能的。

其实总结以来就是一句话:把号段转成数字之后变成一个文件中的索引,这样就避免了查询。

大宝逛庙会

每次带大宝出去吃饭或者玩,起初他都会哭闹一阵,不知道什么原因,或许是因为胆小,平时也不怎么出门,乍一见这么多人,到一陌生地方难免会害怕吧。这次带他去龙潭湖逛庙会也一样。开始在车上还好,可快到的时候就开始闹了,一下车就开始嚎啕大哭。那天人是多了点,我平常也都没见过这么多人。哄了半天,大宝终于停止了哭闹,但还是不肯自己走路。没法,只能抱着他。走了一段,到了人相对少一点的小广场,把大宝放了下来。这回他愿意自己走了,转了几个小圈,发现附近坐着个皮肤白白的漂亮阿姨,他就过去摸摸人家的腿,冲人家乐,还站在那人跟前,半天都不走了。想起大宝几个月大的时候就喜欢和小姐姐小妹妹们,拉拉手楼楼肩的,喜欢拍拍家里阿姨的屁股,突然有点担心他长大后不会是个花心大萝卜吧?那天大宝自己走了很多路,走的很 high ,回去的时候在车上就睡着了,睡的很香。

DSC_0063.jpg