天天看點

Android聯系人中添加歸屬地分組

之前重要負責收集聯系人添加歸屬地,公司這兩個智能分組;網上的實作方法很多,有說通過webserver來查詢,但是網絡這種形式不是長遠之道;畢竟伺服器不是你自己的,還有其他很多的各種不穩定因素。那下面,就主要介紹歸屬地這個分組我是怎麼實作的。

經過自己制作一個第三方的歸屬地資料庫來實作的。我使用的全國手機歸屬地資料記錄是2013年中旬的,當時弄到資料後吓壞,全國的手機歸屬地記錄總共有28.6w多條。正常情況下,每個手機存儲的聯系人數一般是100+多個人。我采取的方式是,先把所有的歸屬地資訊全部查出來然後儲存在配置檔案,如果有添加修改聯系人的操作就重新整理全部重新整理配置檔案。一百多個人全部重新整理大概是4~5s左右,幾十個人的話使用者幾乎感覺不到。是以,這個效率是可行的。下面開始介紹我使如何制作第三方資料庫(程式運作把資料庫拷貝到data目錄對應包名下)和對資料處理的。

        首先我們先分析一下手機号碼,手機号碼的前七位中的前三位是營運商資訊,前七位中的後四位是歸屬地資訊。是以,對于這麼多資料我們應該盡可能的細分為小的子產品,使得每次查詢時的範圍減少才能提高效率。下面列出各個營運商的号碼數:

        資料總數 286764條

電信133 -> 9648 電信153 -> 9818 電信180 -> 9577 電信189 -> 9988 

電信181 -> 8263 移動134 -> 9694 移動135 -> 10000 移動136 -> 10000 

移動137 -> 9976 移動138 -> 9994 移動139 -> 9998 移動150 -> 10000 

移動151 -> 10000 移動152 -> 10000 移動157 -> 7096 移動158 -> 10000 

移動159 -> 10000 移動182 -> 9960 移動183 -> 9975 移動184 -> 4879 

移動187 -> 9980 移動188 -> 9546 聯通130 -> 9884 聯通131 -> 10000 

聯通132 -> 9804 聯通155 -> 10000 聯通156 -> 9781 聯通185 -> 6983 

聯通186 -> 9684 資料卡145 -> 5883 資料卡147 -> 6358 

到這裡你們應該知道我的想法了,那就是把二十八萬條資料按照前三位的不同篩選出來分别插到31個表裡面去(寫代碼從檔案讀出來插進去,前後要花費幾個小時這樣)。最後我的第三方資料庫中所有的表名為:

  d-->電信 l-->聯通 s-->聯通資料卡 y-->移動

public static final String[] TableArray = new String[]{

"d133","d153","d180","d181","d189",

"l130","l131","l132","l155","l156","l185","l186",

"s145","s147",

"y134","y135","y136","y137","y138","y139","y150","y151","y152","y157","y158","y159","y182","y183","y184","y187","y188"

};

表的結構如下(導出DB後Sqliteman工具打開DB檔案檢視):

Android聯系人中添加歸屬地分組

每當從資料庫取得的号碼為13755555551,我們取得他的前三位為:137,那麼我們就應該取它的前七位:1375555去表“y137"查詢歸屬地資訊。我的邏輯是如果号碼不夠11位不進行查詢,就列入無位址資訊項;如果查詢後沒有記錄也列入無位址資訊項。

  這樣做出來的db有8M左右,很大,效率已經可以接受;下一片文章将會再次對資料進行瘦身,争取壓縮到1M左右。初步估算28w條記錄将會被壓縮成7W行,查詢效率性能将會質的提升。

下面是制作資料庫程式和使用Demo的源碼連結,下載下傳下來可以直接運作,下載下傳下來請先看REDME。

http://download.csdn.net/detail/u010949962/6883023