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. LVM卷

    sdb和sdc创建为LVM并且挂载到/benet/ 将sdd扩展到之前的lvm卷 新建2块1G的磁盘和1块2G的磁盘 将分区ID改为8e 创建PV阶段 pvcreate /dev/sdb1 /dev/ ...

  2. OpenFOAM当中监测力和阻力系数

    首先准备好我们自己的平常算例文件,本次我们以圆柱绕流的算例来说明用法 我们找到constant文件夹 打开其中的transportProperties文件 我们将其中的: nu             ...

  3. 依赖倒置原则(DIP)

    1. 定义 (1)高层模块不应依赖于低层模块,两者都应该依赖于抽象.(2)抽象不应该依赖于细节,细节应该依赖于抽象. 为什么是“倒置”这个词? 这是由于许多传统的软件开发方法,比如结构化分析和设计,总 ...

  4. Gated CNN 阅读笔记

    之前看过TCN,稍微了解了一下语言模型,这篇论文也是对语言模型建模,但是由于对语言模型了解不深,一些常用数据处理方法,训练损失的计算包括残差都没有系统的看过,只是参考网上代码对论文做了粗浅的复现.开学 ...

  5. JVM 数组创建的本质

    1.创建数组 创建一个MyParent4[] 数组 public class MyTest4 { public static void main(String[] args) { MyParent4[ ...

  6. lnmp新增https访问【转】

    环境是使用lnmp一键安装包搭建的: 1 首先去这个网站下载证书:免费ssl证书 最终会得到两个文件 2:在/usr/local/nginx/conf创建cert目录把这两个文件放进去,这个地址后面有 ...

  7. CMU Database Systems - Concurrency Control Theory

    并发控制是数据库理论里面最难的课题之一 并发控制首先了解一下事务,transaction 定义如下, 其实transaction关键是,要满足ACID属性, 左边的正式的定义,由于的intuitive ...

  8. windows环境下mosquitto环境搭建与mqtt测试

    https://blog.csdn.net/pgpanda/article/details/51800865 工作需求,自己在windows下搭建了一个mosquitto环境测试mqtt 话不多说,直 ...

  9. futex的设计与实现

    介绍 futex(快速用户空间互斥)是Linux的一个基础组件,可以用来构建各种更高级别的同步机制,比如锁或者信号量等等,POSIX信号量就是基于futex构建的.大多数时候编写应用程序并不需要直接使 ...

  10. 使用jquery循环并获取 json 数组的键/值对

    var resultJSON = '{"FirstName":"John","LastName":"Doe"," ...