微信扫一扫打赏支持

手机归属地查询

手机归属地查询

效果图:

 

分析:

1、传递多个参数,用一个类就好

2、打开数据库

  private SQLiteDatabase database;

  database=SQLiteDatabase.openOrCreateDatabase(file, null);

    file是数据库的路径

3、在逻辑中多加判断

  比如是否获取到正确的手机号

  比如我们操作的字符串是否为空

  比如时候获取正确参数

4、通过文件流来实现释放APK中包中的数据库文件到手机本地

5、需要用的数据库放在assets目录中

  bufferIn = new BufferedInputStream(getAssets().open("naddress.db"));

6、确保输出流flush,如果不flush,数据会变少,有一部分没有成功写出到本地

  bufferOut.flush();

7、try-catch的时候记得finally,去关闭输入流和输出流

8、-1为文件末

  while ((len = bufferIn.read(buffer)) != -1)

9、File file = getDatabasePath("naddress.db");

  这个方法得到这样的路径data/data/包/database/naddress.db

10、如果文件没有成功创建,我们取创建文件夹

  if (!file.exists())

    file.getParentFile().mkdirs();

11、正则表达式匹配手机号

  Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$");  

  Matcher m = p.matcher(phoneNumber);  

  if (!m.matches()) 

12、百度的正确姿势

  java 正则表达式验证手机号

13、找错误的时候多去看cause by

 

代码:

/查询手机号归属地2/res/layout/activity01.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical" >
 6 
 7     <LinearLayout
 8         android:layout_width="match_parent"
 9         android:layout_height="wrap_content"
10         android:orientation="horizontal" >
11 
12         <TextView
13             android:layout_width="wrap_content"
14             android:layout_height="wrap_content"
15             android:text="请输入手机号码:" />
16 
17         <EditText
18             android:id="@+id/et_mobileNum"
19             android:layout_width="205dip"
20             android:layout_height="wrap_content" />
21     </LinearLayout>
22 
23     <TextView
24         android:id="@+id/tv_city_cardType"
25         android:layout_width="wrap_content"
26         android:layout_height="wrap_content"
27         android:textColor="#ff0000"
28         android:textSize="25sp"
29         android:text="归属地:" />
30 
31     <Button 
32         android:id="@+id/btn_search"
33         android:layout_width="wrap_content"
34         android:layout_height="wrap_content"
35         android:layout_gravity="center_horizontal"
36         android:onClick="query"
37         android:text="查询号码归属地" />
38 
39 </LinearLayout>
界面设计

database.AddressDao

 1 package database;
 2 
 3 import java.io.File;
 4 
 5 import bean.InfoBean;
 6 import android.database.Cursor;
 7 import android.database.sqlite.SQLiteDatabase;
 8 
 9 /*
10  * 操作数据库
11  */
12 public class AddressDao {
13     private SQLiteDatabase database;
14     public AddressDao(File file){
15         database=SQLiteDatabase.openOrCreateDatabase(file, null);
16     }
17     /**
18      * 获取城市及卡类型
19      * @param mobilePrefix 手机号码前缀
20      */
21     public InfoBean getCityOrCardType(String mobilePrefix){
22         String sql="select city,cardtype from address_tb where _id in(select outkey from numinfo where mobileprefix=?);";
23         Cursor cursor=database.rawQuery(sql, new String[]{mobilePrefix});
24         //就一条记录,不用用while,就if就好了
25         if(cursor.moveToNext()){
26             String city=cursor.getString(cursor.getColumnIndex("city"));
27             String cardtype=cursor.getString(cursor.getColumnIndex("cardtype"));
28             return new InfoBean(city, cardtype);
29         }
30         return null;
31     }
32 }
数据库操作

bean.InfoBean

 1 package bean;
 2 
 3 public class InfoBean {
 4     private String city;
 5     private String cardType;
 6     
 7     
 8     public InfoBean(String city, String cardType) {
 9         super();
10         this.city = city;
11         this.cardType = cardType;
12     }
13     public String getCity() {
14         return city;
15     }
16     public void setCity(String city) {
17         this.city = city;
18     }
19     public String getCardType() {
20         return cardType;
21     }
22     public void setCardType(String cardType) {
23         this.cardType = cardType;
24     }
25     
26     
27 }
传递数据的类(城市及归属地)

fry.Activity01

  1 package fry;
  2 
  3 import java.io.BufferedInputStream;
  4 import java.io.BufferedOutputStream;
  5 import java.io.File;
  6 import java.io.FileOutputStream;
  7 import java.io.IOException;
  8 import java.util.regex.Matcher;
  9 import java.util.regex.Pattern;
 10 
 11 import bean.InfoBean;
 12 
 13 import com.example.searchMobileCity.R;
 14 
 15 import database.AddressDao;
 16 import android.app.Activity;
 17 import android.os.Bundle;
 18 import android.view.View;
 19 import android.view.View.OnClickListener;
 20 import android.widget.Button;
 21 import android.widget.EditText;
 22 import android.widget.TextView;
 23 import android.widget.Toast;
 24 
 25 public class Activity01 extends Activity {
 26     private Button btn_search;
 27     private EditText et_mobileNum;
 28     private TextView tv_city_cardType;
 29     private AddressDao dao;
 30 
 31     @Override
 32     protected void onCreate(Bundle savedInstanceState) {
 33         // TODO Auto-generated method stub
 34         super.onCreate(savedInstanceState);
 35         setContentView(R.layout.activity01);
 36         initView();
 37         // file就是数据库文件路径
 38         File file = initDatabaseData();
 39         dao = new AddressDao(file);
 40 
 41     }
 42 
 43     private void initView() {
 44         tv_city_cardType = (TextView) findViewById(R.id.tv_city_cardType);
 45         et_mobileNum = (EditText) findViewById(R.id.et_mobileNum);
 46         btn_search = (Button) findViewById(R.id.btn_search);
 47     }
 48 
 49     /*
 50      * 查询归属地
 51      */
 52     public void query(View view) {
 53         tv_city_cardType.setText("归属地:");
 54         String phoneNumber = et_mobileNum.getText().toString();
 55         Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$");  
 56         Matcher m = p.matcher(phoneNumber);  
 57         if (!m.matches()) {
 58             Toast.makeText(this, "请输入正确的手机号", Toast.LENGTH_SHORT).show();
 59             return ;
 60         } else {
 61             String mobilePrefix = phoneNumber.substring(0, 7);
 62             InfoBean bean = dao.getCityOrCardType(mobilePrefix);
 63             if (bean == null) {
 64                 tv_city_cardType.setText("没查询到该号码的城市与归属地!!");
 65             } else {
 66                 tv_city_cardType.setText("城市:" + bean.getCity() + "   \n卡类型: "
 67                         + bean.getCardType());
 68             }
 69         }
 70     }
 71 
 72     /*
 73      * 释放APK中包中的数据库文件到手机本地 读和写
 74      */
 75     private File initDatabaseData() {
 76         // 这个方法得到这样的路径data/data/包/database/naddress.db
 77         File file = getDatabasePath("naddress.db");
 78         if (!file.exists()) {
 79             file.getParentFile().mkdirs();
 80         } else {
 81             return file;
 82         }
 83 
 84         // 获取读入流
 85         BufferedInputStream bufferIn = null;
 86         // 输出流
 87         BufferedOutputStream bufferOut = null;
 88         try {
 89             bufferIn = new BufferedInputStream(getAssets().open("naddress.db"));
 90             bufferOut = new BufferedOutputStream(new FileOutputStream(file));
 91             // 开始释放缓存流
 92             // 读的时候,弄个缓存区,让释放快一点
 93             byte[] buffer = new byte[8000];
 94             int len = 0;
 95             // -1为文件末
 96             while ((len = bufferIn.read(buffer)) != -1) {
 97                 bufferOut.write(buffer, 0, len);
 98                 // 不flush的话文件大小会变小的
 99                 bufferOut.flush();
100             }
101             return file;
102         } catch (IOException e) {
103             // TODO Auto-generated catch block
104             e.printStackTrace();
105         } finally {
106             try {
107                 if (bufferIn != null)
108                     bufferIn.close();
109                 if (bufferOut != null)
110                     bufferOut.close();
111             } catch (IOException e) {
112                 e.printStackTrace();
113             }
114         }
115         return null;
116     }
117 }
主activity

 

posted @ 2017-08-30 04:42  范仁义  阅读(709)  评论(0编辑  收藏  举报