021 Android 查询已经导入到工程中的数据库+抖动效果

1.将数据库(.db)文件放入工程中

在project状态下,新建assets文件夹,并将数据库文件放入assets目录下。

注意:assets目录、java目录、res目录是同级的

new--->dictionary

 2.将assets目录下的address.db,复制到工程的Files文件夹下

复制代码
/**
     * 拷贝assets资产目录下的数据库到files文件夹下
     * @param dbname 数据库名称
     */
    private void initAddressDB(String dbname) {
        //在files文件夹下创建同名dbname数据库文件过程
        File filesDir = getFilesDir();
        File file = new File(filesDir, dbname);
        if(file.exists()){
            return;
        }
        //2.输入流读取第3方资产目录下的文件
        InputStream inputStream=null;
        FileOutputStream fos=null;
        try {
            inputStream = getAssets().open(dbname);
            //3.将读取的内容写入指定的文件夹的文件中
            fos = new FileOutputStream(file);
            //4.指定每次读取文件的大小
            byte[] bs = new byte[1024];
            int temp=-1;
            while ((temp=inputStream.read(bs))!=-1){
                fos.write(bs,0,temp);
            }
            System.out.println("MainActivity:"+"test2019/5/8");
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                //关闭文件流
                if (inputStream != null&&fos!=null) {
                    inputStream.close();
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
复制代码

经过拷贝后的address.db的路径为:data/data/工程包名/files/address.db

3.连接数据库,查询数据

SQLiteDatabase的query方法:

query(boolean distinct,String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit),

这个query方法的参数说明如下:
distinct:指定是否去除重复记录。
table:执行查询数据的表名。
columns:要查询出来的列名(即数据库表中的字段名)。
selection:查询条件子句。
selectionArgs:用于为selection子句中占位符传入参数值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。
groupBy:用于控制分组。
having:用于对分组进行过滤。
orderBy:用于对记录进行排序。
limit:用于进行分页。

4.手机号码的正则表达式

手机号码结构分析
首位:1开头 ^1
第二位:3-8 [3-8]
后面还有9位,必须是数字 \d{9}

手机号码的正则表达式:^1[3-8]\\d{9}

5.java代码

(1)查询数据库

复制代码
package com.example.administrator.test62360safeguard.engine;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.widget.Toast;

public class AddressDao {
    //1.指定访问数据库的路径
    public static String path="data/data/com.example.administrator.test62360safeguard/files/address.db";
    private static String address=null;

    /**
     * 传递一个电话号码,开启数据库连接,进行访问,返回一个归属地
     * @param phone 所要查询的电话号码
     */
    public static String getAddress(String phone){
        String regularExpresstion="^1[3-8]\\d{9}";
        if(phone.matches(regularExpresstion)){
            phone= phone.substring(0, 7);
            //2.开启数据库连接(只读的方式打开)
            SQLiteDatabase db = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
            //3.数据库查询
            //参数1:table 所要查询的表名,参数2:要查询出来的列名(即数据库表中的字段名),参数3、4:构成查询条件
            Cursor cursor=db.query("data1",
                    new String[]{"outkey"},
                    "id=?",
                    new String[]{phone},
                    null,
                    null,
                    null);
            //4.查到即可
            if(cursor.moveToNext()){
                String outkey=cursor.getString(0);
                Log.i("AddressDao:","queryResult:"+outkey);
                //5.通过data1查询到的结果,作为外键查询data2
                //3.数据库查询
                //参数1:table 所要查询的表名,参数2:要查询出来的列名(即数据库表中的字段名),参数3、4:构成查询条件
                Cursor indexcursor=db.query("data2",
                        new String[]{"location"},
                        "id=?",
                        new String[]{outkey},
                        null,
                        null,
                        null);
                if(indexcursor.moveToNext()){
                    address = indexcursor.getString(0);
                    Log.i("AddressDao:","queryResult:"+ address);
                }
            }else {
                address="未知号码";
            }
        }else {
            int length=phone.length();
            switch (length){
                case 3:
                    address="报警电话";
                    break;
                case 4:
                    address="模拟器";
                    break;
                case 5:
                    address="服务电话";
                    break;
                case 7:
                    address="本地电话";
                    break;
                case 8:
                    address="本地电话";
                    break;
            }
        }
        return address;
    }
}
复制代码

(2)查询数据库,获取结果并更新ui界面

复制代码
package com.example.administrator.test62360safeguard;

import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
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.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.example.administrator.test62360safeguard.engine.AddressDao;

public class QueryAddressActivity extends AppCompatActivity {

    EditText etQA_phone_address;
    Button btQA_query;
    TextView tvQA_queryResult;
    private String address="";

    //消息处理机制,用来更新ui
    @SuppressLint("HandlerLeak")
    Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            tvQA_queryResult.setText(address);
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_query_address);

        //System.out.println("QueryAddressActivity:"+AddressDao.getAddress("110"));
        initUI();
    }

    private void initUI() {
        etQA_phone_address=findViewById(R.id.etQA_phone_address);
        btQA_query=findViewById(R.id.btQA_query);
        tvQA_queryResult=findViewById(R.id.tvQA_queryResult);
        //给按钮绑定点击事件
        btQA_query.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //String address = AddressDao.getAddress(phone_address);
                String phone_address=etQA_phone_address.getText().toString().trim();
                if(!TextUtils.isEmpty(phone_address)){
                    queryAddress(phone_address);
                }else {
                    //若EditText etQA_phone_address中未输入内容,则输入框设置抖动
                    Animation shake = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.shake);
                    etQA_phone_address.startAnimation(shake); //给输入框设置抖动效果
                }

            }
        });
    }

    /**
     * 获取电话归属地
     * @param phone_address 查询号码
     */
    private void queryAddress(final String phone_address) {
        //查询数据库是一个耗时操作,要放到子线程中
        new Thread(){
            @Override
            public void run() {
                address = AddressDao.getAddress(phone_address);
                System.out.println("QueryAddressActivity:"+address);
                handler.sendEmptyMessage(0);
            }
        }.start();
    }
}
复制代码

6.效果图

posted @   雨后观山色  阅读(259)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示