Android属于查询执行情况的电话号码

这部分是昨天学习,但是因为眼所以现在到眼睛超负荷,以后要合理规划时间。

现在里面的手机号码归属地查询主要通过两种途径: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()方法,打开文件返回输入流。


实现界面:就一个简单的输入框,button,显示框即可。


工具类:

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;
	}
}


调用显示:

点击button时:

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
				
			}
		});



版权声明:本文博客原创文章,博客,未经同意,不得转载。

posted @ 2015-08-23 15:32  blfshiye  阅读(162)  评论(0编辑  收藏  举报