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. MySQL 常用字段类型与对应的Java类型

    varchar 不定长字符串 字符串或是没有合适类型时,可以选择它作为字段类型 对应Java中的String int bigint 数值 一般以int作为数字的默认选择,数值很大时使用bigint 对 ...

  2. <c:choose>

    备注一下属性 DIV没有VALUE属性     <c:choose> <c:when test="${yggModel.type=='0'}">食品< ...

  3. 一个想要拥有正常的F1~F12的联想小新潮

    联想如何切换至正常的F1~F12 Fn+Fx的生活让我疲倦,实在难受,就开始了尝试关闭Fn 问题一:无法打开BIOS设置界面 重启,在开机界面时,按F2???顺利开机-(相较于台式机开机时,可以按F2 ...

  4. [Android] 安卓手机不用root删除自带app

    声明:本文档仅供测试,因删除引起的一切问题,本人概不负责 声明:本文档仅供测试,因删除引起的一切问题,本人概不负责 声明:本文档仅供测试,因删除引起的一切问题,本人概不负责 转载请注明出处:https ...

  5. 【转】python requests库添加自定义cookie的方法

    requests库是个很方便的爬虫,相关文档已经很详细了.不过我今天在爬网页时,有一个网站是在脚本中添加cookie的,但我向requests.cookies里添加cookie费了不少周折.尝试了多个 ...

  6. 自定义alert弹框,title不显示域名(重写alert)

    问题: 系统默认的alert弹框的title会默认显示网页域名 解决办法: (修改弹框样式) (function() { window.alert = function(name) { $(" ...

  7. Linux 限制IP——/etc/hosts.allow和/etc/hosts.deny文件【转】

    就像是 限制特定IP来访 想法 看起来通常的做法是利用hosts的拒绝设置,而它的设置是针对某一个具体的进程,具体的服务,在这里就是sshd了 看起来设置一个网段使用的是 x.x.x.0/24 后面加 ...

  8. Nutch、Scrapy、Lucene、Heritrix、Solr、Sphinx

    Nutch.Scrapy.Lucene.Heritrix.Solr.Sphinx

  9. JS Array.apply会有内存泄漏问题

    报错内容: Maximum call stack size exceeded 参考:https://www.jianshu.com/p/b9ba0ddd3392 对象较多,前端JS内存溢出: 数组克隆 ...

  10. Java 13 特性解读

    Java 13 特性解读    转 https://blog.csdn.net/bjweimengshu/article/details/100978383   2017年8月,JCP执行委员会提出将 ...