565
外匯
手機衛士13-手機歸屬地數據庫
獲得手機號碼歸屬地,我們有兩種方式,一種就是通過WebService來獲取嘛,但是這個是依賴於網絡的,如果沒有網絡,那就沒有辦法用啦
另一種方法就是通過內置一個數據庫,然後在用的時候查詢就可以啦,但是這個數據庫會很大,有16M所以這樣就會造成我們的app體積過大的啦
所以我們就要對它進行壓縮一下,怎樣壓縮呢,其實就是把裏麵一些重複的字段提取出來,然後達到壓縮的作用,這個數據庫經過我們的壓縮,可以縮小到3M
這兩個數據庫,我會放到應用程序裏麵一起打包,想要下載的,到時可以下載來看看
未壓縮前的數據庫
我們可以看到,裏麵存放了很多中文字符,這就是這個數據庫為什麼那麼大的原因啦,我們完全可以把這些中文放到另一個表,然後就存放一個id就行啦,這樣就可以大大的縮小數據庫的大小的啦
壓縮後的數據庫
壓縮後的數據庫就是上麵一樣的啦,體積隻有3M,大大的縮小了體積。
如果我們想讓這個數據庫隨著apk裝到用戶裏麵去,那麼就要把這個文件放到res/raw這個目錄下麵,因為這個目錄下麵的資源都不會編譯成二進製的格式的,所以然後就可以把整個數據庫讀取到sd卡上啦
但我們這個程序為了演示,我們就使用16M的那個大數據庫啦,而且是通過網絡把我們要用的數據庫下載下來
好啦,廢話不多說,直接上代碼
com.xiaobin.security.ui.AToolActivity
-
package com.xiaobin.security.ui;
-
-
import java.io.File;
-
-
import android.annotation.SuppressLint;
-
import android.app.Activity;
-
import android.app.ProgressDialog;
-
import android.content.Intent;
-
import android.os.Bundle;
-
import android.os.Environment;
-
import android.os.Handler;
-
import android.os.Message;
-
import android.view.View;
-
import android.view.View.OnClickListener;
-
import android.widget.TextView;
-
import android.widget.Toast;
-
-
import com.xiaobin.security.R;
-
import com.xiaobin.security.engine.DownloadTask;
-
-
public class AToolActivity extends Activity implements OnClickListener
-
{
-
private static final int ERROR = 0;
-
private static final int SUCCESS = 1;
-
-
private TextView tv_atool_query;
-
private ProgressDialog pd;
-
-
@SuppressLint("HandlerLeak")
-
private Handler handler = new Handler()
-
{
-
public void handleMessage(Message msg)
-
{
-
switch(msg.what)
-
{
-
case ERROR :
-
Toast.makeText(AToolActivity.this, "下載數據庫失敗,請檢查網絡!", Toast.LENGTH_SHORT).show();
-
break;
-
-
case SUCCESS :
-
Toast.makeText(AToolActivity.this, "數據庫下載成功!", Toast.LENGTH_SHORT).show();
-
break;
-
-
default :
-
break;
-
}
-
}
-
};
-
-
@Override
-
protected void onCreate(Bundle savedInstanceState)
-
{
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.atool);
-
-
tv_atool_query = (TextView) findViewById(R.id.tv_atool_query);
-
tv_atool_query.setOnClickListener(this);
-
}
-
-
@Override
-
public void onClick(View v)
-
{
-
switch(v.getId())
-
{
-
case R.id.tv_atool_query :
-
if(isDBExist())
-
{
-
Intent intent = new Intent(this, QueryNumberActivity.class);
-
startActivity(intent);
-
}
-
else
-
{
-
//提示用戶下載數據庫
-
pd = new ProgressDialog(this);
-
pd.setMessage("正在下載數據庫...");
-
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
-
pd.setCancelable(false);
-
pd.show();
-
new Thread()
-
{
-
public void run()
-
{
-
String path = getResources().getString(R.string.serverdb);
-
File dir = new File(Environment.getExternalStorageDirectory(), "/security/db");
-
if(!dir.exists())
-
{
-
dir.mkdirs();
-
}
-
String dbPath = Environment.getExternalStorageDirectory() + "/security/db/data.db";
-
try
-
{
-
//這個類,我們在做更新apk的時候已經寫好的啦,現在直接拿過來用就可以啦
-
DownloadTask.getFile(path, dbPath, pd);
-
pd.dismiss();
-
}
-
catch (Exception e)
-
{
-
e.printStackTrace();
-
pd.dismiss();
-
Message message = new Message();
-
message.what = ERROR;
-
handler.sendMessage(message);
-
}
-
};
-
}.start();
-
}
-
break;
-
-
default :
-
break;
-
}
-
}
-
-
private boolean isDBExist()
-
{
-
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
-
{
-
File file = new File(Environment.getExternalStorageDirectory() + "/security/db/data.db");
-
if(file.exists())
-
{
-
return true;
-
}
-
}
-
return false;
-
}
-
-
}
-
package com.xiaobin.security.dao;
-
-
import android.database.sqlite.SQLiteDatabase;
-
-
public class AddressDao
-
{
-
-
public static SQLiteDatabase getAddressDB(String path)
-
{
-
//打開那個存放電話號碼的數據庫
-
return SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
-
}
-
-
}
-
package com.xiaobin.security.engine;
-
-
import android.database.Cursor;
-
import android.database.sqlite.SQLiteDatabase;
-
import android.os.Environment;
-
-
import com.xiaobin.security.dao.AddressDao;
-
-
public class NumberAddressService
-
{
-
-
public static String getAddress(String number)
-
{
-
String pattern = "^1[3458]\\d{9}$";
-
String address = number;
-
if(number.matches(pattern))//手機號碼
-
{
-
address = query("select city from info where mobileprefix = ? ", new String[] {number.substring(0, 7)});
-
if(address.equals(""))
-
{
-
address = number;
-
}
-
}
-
else //固定電話
-
{
-
int len = number.length();
-
switch(len)
-
{
-
case 4 : //模擬器
-
address = "模擬器";
-
break;
-
-
case 7 : //本地號碼
-
address = "本地號碼";
-
break;
-
-
case 8 : //本地號碼
-
address = "本地號碼";
-
break;
-
-
case 10 : //3位區號,7位號碼
-
address = query("select city from info where area = ? limit 1", new String[] {number.substring(0, 3)});
-
if(address.equals(""))
-
{
-
address = number;
-
}
-
break;
-
-
case 11 : //3位區號,8位號碼 或4位區號,7位號碼
-
address = query("select city from info where area = ? limit 1", new String[] {number.substring(0, 3)});
-
if(address.equals(""))
-
{
-
address = query("select city from info where area = ? limit 1", new String[] {number.substring(0, 4)});
-
if(address.equals(""))
-
{
-
address = number;
-
}
-
}
-
break;
-
-
case 12 : //4位區號,8位號碼
-
address = query("select city from info where area = ? limit 1", new String[] {number.substring(0, 4)});
-
if(address.equals(""))
-
{
-
address = number;
-
}
-
break;
-
-
default :
-
break;
-
}
-
}
-
return address;
-
}
-
-
private static String query(String sql, String[] selectionArgs)
-
{
-
String result = "";
-
String path = Environment.getExternalStorageDirectory() + "/security/db/data.db";
-
SQLiteDatabase db = AddressDao.getAddressDB(path);
-
if(db.isOpen())
-
{
-
Cursor cursor = db.rawQuery(sql, selectionArgs);
-
if(cursor.moveToNext())
-
{
-
result = cursor.getString(0);
-
}
-
cursor.close();
-
db.close();
-
}
-
return result;
-
}
-
-
}
-
package com.xiaobin.security.ui;
-
-
import android.app.Activity;
-
import android.os.Bundle;
-
import android.text.TextUtils;
-
import android.view.View;
-
import android.view.animation.Animation;
-
import android.view.animation.AnimationUtils;
-
import android.widget.EditText;
-
import android.widget.TextView;
-
-
import com.xiaobin.security.R;
-
import com.xiaobin.security.engine.NumberAddressService;
-
-
public class QueryNumberActivity extends Activity
-
{
-
private TextView tv_result;
-
private EditText et_query_number;
-
-
@Override
-
protected void onCreate(Bundle savedInstanceState)
-
{
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.query_number);
-
-
tv_result = (TextView) findViewById(R.id.tv_query_result);
-
et_query_number = (EditText) findViewById(R.id.et_query_number);
-
}
-
-
public void query(View v)
-
{
-
String number = et_query_number.getText().toString().trim();
-
//如果查詢內容為空,那麼就抖動輸入框
-
if(TextUtils.isEmpty(number))
-
{
-
Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake);
-
et_query_number.startAnimation(shake);
-
}
-
else
-
{
-
String address = NumberAddressService.getAddress(number);
-
tv_result.setText("歸屬地信息:" + address);
-
}
-
}
-
-
}

就是這個樣子的啦,當然我們還會進行很多細節處理,如用戶自己定義那個歸屬地的顯示位置啦,還有自己定義顯示的風格啦,好啦,下次我們要說的主要就是這個啦!

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