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

021 Android 查询已经导入到工程中的数据库+抖动效果的更多相关文章
- openCV(一)---将openCV框架导入iOS工程中
开发环境: Xcode 6.4 openCV for iOS 3.0 配置openCV开发环境 在OpenCV官网中下载OpenCV开发包(官网地址:http://opencv.org/) ...
- 将Android源码导入eclipse中的方法以及编译Android源码指定模块
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/53365659 将android源码导入eclipse.androidstudio. ...
- iOS在支持arc的工程中,导入不支持arc的第三方的插件
首先将插件导入到工程中,然后点击工程名,在targets下面找到相应的条目,然后选择build phares,打开第二行compile sourses,然后找到不支持arc的.m文件,在后边添加上“- ...
- sqoop 操作从hdfs 导入到mysql中语句
将hdfs下/dw/dms/usr_trgt下的文件导入到mysql中test数据库下usr_trgt表中 sqoop-export --connect jdbc:mysql://mysqlDB: ...
- 将Android studio的工程导入到eclipse中
自从Android Studio(后面称AS)推出后,越来越多的项目都使用AS开发. AS往eclipse迁移的方法: 其实很简单,代码都是一样的,从AS工程中找到与Eclipse工程对应的文件,放到 ...
- Android studio 导入 github 工程
最近从 github 下载两个开源项目,导入 Android Studio 都以 Studio 卡死结束.第一次以为是项目问题,第二次查询资料发现导入方式不正确,在此整理. 原目录结构如下: Andr ...
- 【Android】如何将eclipse工程导入studio
1.eclipse工程右键->export->Generate Gradle build files 2.studio->New->import project->选择工 ...
- 导入Eclipse工程 到 Android Studio
一.从Eclipse导入工程到Android Studio 根据官方的介绍,Android Studio可以兼容Eclipse的现有工程,但需要做一些操作: 首先升级ADT到最新版本,目前为版本号为2 ...
- 【转】Android studio 导入github工程
http://blog.csdn.net/feixiaku/article/details/45155587/ 从github下载两个开源项目: PagerSlidingTabStrip | ...
随机推荐
- Docker 常用命令,自用,持续更
1.进入容器 docker exec -it 容器id /bin/bash docker exec -it db30f533ee1b /bin/bash 2.复制文件到容器 docker cp 文件路 ...
- SpringBoot获取Freemarker模板引擎,生成HTML代码
今天用Ajax异步添加评论,加载Freemarker模板引擎,生成模板模块 1.新建Freemarker模板 <li id="${comment.oId}"> < ...
- Spring MVC原理及配置
Spring MVC原理及配置 1. Spring MVC概述 Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得 ...
- [CMS]ThinkCMF框架存在任意内容包含漏洞
原出处:https://www.freebuf.com/vuls/217586.html 0x00 简介 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3 ...
- jquery 如何在js中间加入css?
) { $() + 'rem' }) } ) { $( + '%' }) }
- cnetos7--zabbix(3.4)-server安装
1.安装前准备 (1)关闭防火墙 [root@localhost ~]#Systemctl stop firewalld.service (2)开机关闭防火墙 [root@localhost ~]#S ...
- Shell脚本——make命令和Makefile文件【转】
https://blog.csdn.net/twc829/article/details/72729799 make命令是一个常用的编译命令,尤其在C/C++开发中,make命令通过makefile文 ...
- layui select 下拉框 级联 动态赋值 与获取选中值
//下拉框必须在 class="layui-form" 里 不然监听事件没有作用 <div class="layui-form" > <div ...
- ztree checkbox父子联动
1. 对于ztree而言,如果需要设置或者取消ztree的父子联动,只要在setting里面设置chkboxType的参数即可: 其中Y表示被checkbox被勾选时的联动情况,N表示取消勾选时的联动 ...
- pytorch 想在一个优化器中设置多个网络参数的写法
使用tertools.chain将参数链接起来即可 import itertools ... self.optimizer = optim.Adam(itertools.chain(self.enco ...