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.效果图

021 Android 查询已经导入到工程中的数据库+抖动效果的更多相关文章

  1. openCV(一)---将openCV框架导入iOS工程中

    开发环境: Xcode 6.4   openCV for iOS 3.0    配置openCV开发环境 在OpenCV官网中下载OpenCV开发包(官网地址:http://opencv.org/) ...

  2. 将Android源码导入eclipse中的方法以及编译Android源码指定模块

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/53365659 将android源码导入eclipse.androidstudio. ...

  3. iOS在支持arc的工程中,导入不支持arc的第三方的插件

    首先将插件导入到工程中,然后点击工程名,在targets下面找到相应的条目,然后选择build phares,打开第二行compile sourses,然后找到不支持arc的.m文件,在后边添加上“- ...

  4. sqoop 操作从hdfs 导入到mysql中语句

    将hdfs下/dw/dms/usr_trgt下的文件导入到mysql中test数据库下usr_trgt表中 sqoop-export   --connect jdbc:mysql://mysqlDB: ...

  5. 将Android studio的工程导入到eclipse中

    自从Android Studio(后面称AS)推出后,越来越多的项目都使用AS开发. AS往eclipse迁移的方法: 其实很简单,代码都是一样的,从AS工程中找到与Eclipse工程对应的文件,放到 ...

  6. Android studio 导入 github 工程

    最近从 github 下载两个开源项目,导入 Android Studio 都以 Studio 卡死结束.第一次以为是项目问题,第二次查询资料发现导入方式不正确,在此整理. 原目录结构如下: Andr ...

  7. 【Android】如何将eclipse工程导入studio

    1.eclipse工程右键->export->Generate Gradle build files 2.studio->New->import project->选择工 ...

  8. 导入Eclipse工程 到 Android Studio

    一.从Eclipse导入工程到Android Studio 根据官方的介绍,Android Studio可以兼容Eclipse的现有工程,但需要做一些操作: 首先升级ADT到最新版本,目前为版本号为2 ...

  9. 【转】Android studio 导入github工程

    http://blog.csdn.net/feixiaku/article/details/45155587/ 从github下载两个开源项目: PagerSlidingTabStrip    |   ...

随机推荐

  1. coturn编译运行在Windows平台

    turn 编译安装到Windows平台 https://www.webrtc-experiment.com/docs/TURN-server-installation-guide.html#windo ...

  2. SSM 整合 ehcache spring 配置文件报错

    添加 <!-- end MyBatis使用ehcache缓存 --> <cache:annotation-driven cache-manager="cacheManage ...

  3. MySQL七种join理论

    1. 内连接 select * from A inner join B where A.key=B.key; 2. 左连接 select * from A left join B on A.key=B ...

  4. 浅谈Python-IO多路复用(select、poll、epoll模式)

    1. 什么是IO多路复用 在传统socket通信中,存在两种基本的模式, 第一种是同步阻塞IO,其线程在遇到IO操作时会被挂起,直到数据从内核空间复制到用户空间才会停止,因为对CPython来说,很多 ...

  5. Spark(二)—— 标签计算、用户画像应用

    一.标签计算 数据 86913510 {"reviewPics":[],"extInfoList":null,"expenseList":n ...

  6. Windowns下code: command not found

    错误信息:code: command not found’ 解决办法:配置VsCode环境变量 首先找到VsCode点击其属性,查看路径 进入这个路径后 将D:\Program Files\Micro ...

  7. ADO.NET五大对象增删改查使用

    string ConnStr = "Data Source=.;Initial Catalog=ADO_DEMO;Integrated Security=True"; #regio ...

  8. MySql数据库转设计文档(mysql-font工具和sql语句导出)

    一.工具导出 1.使用的是MySQL-Front工具,这个工具使用非常方便,尤其是导出数据的时候,几百万的数据一两分钟就导完了,推荐使用. MySQL-Front下载(只有3.93M):http:// ...

  9. 源码分析关于SpringBoot2.x版本与1.5版本之间的问题

    1.Social包在SpringBoot2.x移除问题 spring-boot-autoconfigure1.5x版本中支持facebook,领英和推特官方文档:https://docs.spring ...

  10. 回声消除(AEC)原理

    一.前言 因为工作的关系,笔者从2004年开始接触回声消除(Echo Cancellation)技术,而后一直在某大型通讯企业从事与回声消除技术相关的工作,对回声消除这个看似神秘.高端和难以理解的技术 ...