Android中手機號碼歸屬地查詢實現
阿新 • • 發佈:2019-01-28
這部分是昨天學習的,但是因為眼睛超負荷所以拖到現在,以後要合理規劃時間。
目前手機裡面的號碼歸屬地查詢主要是通過兩種方式:1.聯網查詢,2.匹配本機歸屬地資料庫。
我認為兩種結合方式最好,在本地資料庫中匹配不到的在進行聯網查詢,能大大增加匹配效果,並且不用過於增加本地資料庫容量而增大安裝包大小。
步驟:1.開啟軟體的時候把資料庫從assets目錄拷貝到files目錄下,如果已存在,則不用重新拷貝。
2.實現介面。
3.實現工具類PhoneAddressUtils的getPhoneAddress()方法
4.在介面類activity裡呼叫工具類方法得到地址兵顯示出來。
首先是複製資料庫的操作:
private void copyDB() { File file = new File(getFilesDir(), "address.db"); if(file.exists()&&file.length()>0) { Toast.makeText(this, "已經複製資料庫", 0).show(); } else { try { AssetManager am = getAssets(); byte[] buffer = new byte[1024]; InputStream is = am.open("address.db"); FileOutputStream fis = new FileOutputStream(file); int len = 0; while((len=is.read(buffer))>0) { fis.write(buffer, 0, len); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
因為執行中工具類得不到assets目錄下的檔案,所以要在在開機啟動的SplashActivity中把資料庫拷貝到files目錄下。
獲得assert目錄下的檔案要用AssetManager物件的open()方法,開啟檔案返回輸入流。
實現介面:就一個簡單的輸入框,按鈕,顯示框就行。
工具類:
package com.itheima.mobilesafe.db.dao; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; public class AddressDao { private static String path = "data/data/com.itheima.mobilesafe/files/address.db"; public static String getAddress(String number) { String address = number; if(number.matches("^1[34568]\\d{9}$")) { String sql = "select location from data2 where id = (select outkey from data1 where id= ?)"; SQLiteDatabase database = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY); Cursor cursor = database.rawQuery(sql, new String[] {number.substring(0, 7)}); while(cursor.moveToNext()) { address = cursor.getString(0); } cursor.close(); database.close(); } else { address = "不是手機號碼"; } return address; } }
呼叫顯示:
點選按鈕時:
public void queryAddress(View view) {
String number = et_phone.getText().toString();
String address = AddressDao.getAddress(number);
et_address.setText(address);
}
但是我們要動態的顯示位置,所以要對輸入框加一個TextChangedListener,當輸入字串大於3的時候,自動呼叫進行匹配顯示出來。
et_phone.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
if(s.length()>3) {
String address = AddressDao.getAddress(s.toString());
et_address.setText(address);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});