閱讀565 返回首頁    go 外匯


手機衛士13-手機歸屬地數據庫

獲得手機號碼歸屬地,我們有兩種方式,一種就是通過WebService來獲取嘛,但是這個是依賴於網絡的,如果沒有網絡,那就沒有辦法用啦

另一種方法就是通過內置一個數據庫,然後在用的時候查詢就可以啦,但是這個數據庫會很大,有16M所以這樣就會造成我們的app體積過大的啦

所以我們就要對它進行壓縮一下,怎樣壓縮呢,其實就是把裏麵一些重複的字段提取出來,然後達到壓縮的作用,這個數據庫經過我們的壓縮,可以縮小到3M

這兩個數據庫,我會放到應用程序裏麵一起打包,想要下載的,到時可以下載來看看

未壓縮前的數據庫


我們可以看到,裏麵存放了很多中文字符,這就是這個數據庫為什麼那麼大的原因啦,我們完全可以把這些中文放到另一個表,然後就存放一個id就行啦,這樣就可以大大的縮小數據庫的大小的啦

壓縮後的數據庫


壓縮後的數據庫就是上麵一樣的啦,體積隻有3M,大大的縮小了體積。


如果我們想讓這個數據庫隨著apk裝到用戶裏麵去,那麼就要把這個文件放到res/raw這個目錄下麵,因為這個目錄下麵的資源都不會編譯成二進製的格式的,所以然後就可以把整個數據庫讀取到sd卡上啦

但我們這個程序為了演示,我們就使用16M的那個大數據庫啦,而且是通過網絡把我們要用的數據庫下載下來


好啦,廢話不多說,直接上代碼

com.xiaobin.security.ui.AToolActivity

  1. package com.xiaobin.security.ui;

  2. import java.io.File;

  3. import android.annotation.SuppressLint;
  4. import android.app.Activity;
  5. import android.app.ProgressDialog;
  6. import android.content.Intent;
  7. import android.os.Bundle;
  8. import android.os.Environment;
  9. import android.os.Handler;
  10. import android.os.Message;
  11. import android.view.View;
  12. import android.view.View.OnClickListener;
  13. import android.widget.TextView;
  14. import android.widget.Toast;

  15. import com.xiaobin.security.R;
  16. import com.xiaobin.security.engine.DownloadTask;

  17. public class AToolActivity extends Activity implements OnClickListener
  18. {
  19.         private static final int ERROR = 0;
  20.         private static final int SUCCESS = 1;
  21.         
  22.         private TextView tv_atool_query;
  23.         private ProgressDialog pd;
  24.         
  25.         @SuppressLint("HandlerLeak")
  26.         private Handler handler = new Handler()
  27.         {
  28.                 public void handleMessage(Message msg) 
  29.                 {
  30.                         switch(msg.what)
  31.                         {
  32.                                 case ERROR : 
  33.                                         Toast.makeText(AToolActivity.this, "下載數據庫失敗,請檢查網絡!", Toast.LENGTH_SHORT).show();
  34.                                         break;
  35.                                         
  36.                                 case SUCCESS : 
  37.                                         Toast.makeText(AToolActivity.this, "數據庫下載成功!", Toast.LENGTH_SHORT).show();
  38.                                         break;
  39.                                         
  40.                                 default : 
  41.                                         break;
  42.                         }
  43.                 }
  44.         };
  45.         
  46.         @Override
  47.         protected void onCreate(Bundle savedInstanceState)
  48.         {
  49.                 super.onCreate(savedInstanceState);
  50.                 setContentView(R.layout.atool);
  51.                 
  52.                 tv_atool_query = (TextView) findViewById(R.id.tv_atool_query);
  53.                 tv_atool_query.setOnClickListener(this);
  54.         }

  55.         @Override
  56.         public void onClick(View v)
  57.         {
  58.                 switch(v.getId())
  59.                 {
  60.                         case R.id.tv_atool_query : 
  61.                                 if(isDBExist())
  62.                                 {
  63.                                         Intent intent = new Intent(this, QueryNumberActivity.class);
  64.                                         startActivity(intent);
  65.                                 }
  66.                                 else
  67.                                 {
  68.                                         //提示用戶下載數據庫
  69.                                         pd = new ProgressDialog(this);
  70.                                         pd.setMessage("正在下載數據庫...");
  71.                                         pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  72.                                         pd.setCancelable(false);
  73.                                         pd.show();
  74.                                         new Thread()
  75.                                         {
  76.                                                 public void run() 
  77.                                                 {
  78.                                                         String path = getResources().getString(R.string.serverdb);
  79.                                                         File dir = new File(Environment.getExternalStorageDirectory(), "/security/db");
  80.                                                         if(!dir.exists())
  81.                                                         {
  82.                                                                 dir.mkdirs();
  83.                                                         }
  84.                                                         String dbPath = Environment.getExternalStorageDirectory() + "/security/db/data.db";
  85.                                                         try
  86.                                                         {
  87.                                                                 //這個類,我們在做更新apk的時候已經寫好的啦,現在直接拿過來用就可以啦
  88.                                                                 DownloadTask.getFile(path, dbPath, pd);
  89.                                                                 pd.dismiss();
  90.                                                         }
  91.                                                         catch (Exception e)
  92.                                                         {
  93.                                                                 e.printStackTrace();
  94.                                                                 pd.dismiss();
  95.                                                                 Message message = new Message();
  96.                                                                 message.what = ERROR;
  97.                                                                 handler.sendMessage(message);
  98.                                                         }
  99.                                                 };
  100.                                         }.start();
  101.                                 }
  102.                                 break;
  103.                                 
  104.                         default : 
  105.                                 break;
  106.                 }
  107.         }
  108.         
  109.         private boolean isDBExist()
  110.         {
  111.                 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
  112.                 {
  113.                         File file = new File(Environment.getExternalStorageDirectory() + "/security/db/data.db");
  114.                         if(file.exists())
  115.                         {
  116.                                 return true;
  117.                         }
  118.                 }
  119.                 return false;
  120.         }

  121. }
複製代碼
我們會先把數據庫下載下來,然後再進行操作所以我們會有一個daocom.xiaobin.security.dao.AddressDao
  1. package com.xiaobin.security.dao;

  2. import android.database.sqlite.SQLiteDatabase;

  3. public class AddressDao
  4. {
  5.         
  6.         public static SQLiteDatabase getAddressDB(String path)
  7.         {
  8.                 //打開那個存放電話號碼的數據庫
  9.                 return SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
  10.         }

  11. }
複製代碼
然後呢,有一個類來判斷是那一個地方的號碼com.xiaobin.security.engine.NumberAddressService
  1. package com.xiaobin.security.engine;

  2. import android.database.Cursor;
  3. import android.database.sqlite.SQLiteDatabase;
  4. import android.os.Environment;

  5. import com.xiaobin.security.dao.AddressDao;

  6. public class NumberAddressService
  7. {
  8.         
  9.         public static String getAddress(String number)
  10.         {
  11.                 String pattern = "^1[3458]\\d{9}$";
  12.                 String address = number;
  13.                 if(number.matches(pattern))//手機號碼
  14.                 {
  15.                         address = query("select city from info where mobileprefix = ? ", new String[] {number.substring(0, 7)});
  16.                         if(address.equals(""))
  17.                         {
  18.                                 address = number;
  19.                         }
  20.                 }
  21.                 else        //固定電話
  22.                 {
  23.                         int len = number.length();
  24.                         switch(len)
  25.                         {
  26.                                 case 4 : //模擬器
  27.                                         address = "模擬器";
  28.                                         break;
  29.                                         
  30.                                 case 7 : //本地號碼
  31.                                         address = "本地號碼";
  32.                                         break;
  33.                                         
  34.                                 case 8 : //本地號碼
  35.                                         address = "本地號碼";
  36.                                         break;
  37.                                         
  38.                                 case 10 : //3位區號,7位號碼
  39.                                         address = query("select city from info where area = ? limit 1", new String[] {number.substring(0, 3)});
  40.                                         if(address.equals(""))
  41.                                         {
  42.                                                 address = number;
  43.                                         }
  44.                                         break;
  45.                                         
  46.                                 case 11 : //3位區號,8位號碼  或4位區號,7位號碼
  47.                                         address = query("select city from info where area = ? limit 1", new String[] {number.substring(0, 3)});
  48.                                         if(address.equals(""))
  49.                                         {
  50.                                                 address = query("select city from info where area = ? limit 1", new String[] {number.substring(0, 4)});
  51.                                                 if(address.equals(""))
  52.                                                 {
  53.                                                         address = number;
  54.                                                 }
  55.                                         }
  56.                                         break;
  57.                                         
  58.                                 case 12 : //4位區號,8位號碼
  59.                                         address = query("select city from info where area = ? limit 1", new String[] {number.substring(0, 4)});
  60.                                         if(address.equals(""))
  61.                                         {
  62.                                                 address = number;
  63.                                         }
  64.                                         break;
  65.                                         
  66.                                 default : 
  67.                                         break;
  68.                         }
  69.                 }
  70.                 return address;
  71.         }
  72.         
  73.         private static String query(String sql, String[] selectionArgs)
  74.         {
  75.                 String result = "";
  76.                 String path = Environment.getExternalStorageDirectory() + "/security/db/data.db";
  77.                 SQLiteDatabase db = AddressDao.getAddressDB(path);
  78.                 if(db.isOpen())
  79.                 {
  80.                         Cursor cursor = db.rawQuery(sql, selectionArgs);
  81.                         if(cursor.moveToNext())
  82.                         {
  83.                                 result = cursor.getString(0);
  84.                         }
  85.                         cursor.close();
  86.                         db.close();
  87.                 }
  88.                 return result;
  89.         }

  90. }
複製代碼
然後呢,我們就要去到之前完成的界麵裏麵,補上一些邏輯啦com.xiaobin.security.ui.QueryNumberActivity
  1. package com.xiaobin.security.ui;

  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.text.TextUtils;
  5. import android.view.View;
  6. import android.view.animation.Animation;
  7. import android.view.animation.AnimationUtils;
  8. import android.widget.EditText;
  9. import android.widget.TextView;

  10. import com.xiaobin.security.R;
  11. import com.xiaobin.security.engine.NumberAddressService;

  12. public class QueryNumberActivity extends Activity
  13. {
  14.         private TextView tv_result;
  15.         private EditText et_query_number;
  16.         
  17.         @Override
  18.         protected void onCreate(Bundle savedInstanceState)
  19.         {
  20.                 super.onCreate(savedInstanceState);
  21.                 setContentView(R.layout.query_number);
  22.                 
  23.                 tv_result = (TextView) findViewById(R.id.tv_query_result);
  24.                 et_query_number = (EditText) findViewById(R.id.et_query_number);
  25.         }
  26.         
  27.         public void query(View v)
  28.         {
  29.                 String number = et_query_number.getText().toString().trim();
  30.                 //如果查詢內容為空,那麼就抖動輸入框
  31.                 if(TextUtils.isEmpty(number))
  32.                 {
  33.                         Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake);
  34.                         et_query_number.startAnimation(shake);
  35.                 }
  36.                 else
  37.                 {
  38.                         String address = NumberAddressService.getAddress(number);
  39.                         tv_result.setText("歸屬地信息:" + address);
  40.                 }
  41.         }

  42. }
複製代碼
好啦,到現在為止,那個查詢號碼歸屬地的,我們就已經做好的啦,我們下一次將會把歸屬地在有電話打進來的時候顯示出來!先給個圖給大家看一下先 

就是這個樣子的啦,當然我們還會進行很多細節處理,如用戶自己定義那個歸屬地的顯示位置啦,還有自己定義顯示的風格啦,好啦,下次我們要說的主要就是這個啦!
 Security_13手機號碼歸屬地的邏輯.rar (909.17 KB, 下載次數: 70) 

最後更新:2017-04-03 14:54:38

  上一篇:go 劍指Offer之翻轉單詞順序
  下一篇:go BES