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 | ...
随机推荐
- xftp实现本地与服务器的文件上传下载(windows)
背景: Jemter环境搭建,需上传下载服务器文件到aws服务器上,由于secureCRT的局限性它只支持pub格式的密钥,不支持pem格式密钥,xshell是支持pem格式的,所以尝试安装xshel ...
- 【模板】最小割树(Gomory-Hu Tree)
传送门 Description 给定一个\(n\)个点\(m\)条边的无向连通图,多次询问两点之间的最小割 两点间的最小割是这样定义的:原图的每条边有一个割断它的代价,你需要用最小的代价使得这两个点不 ...
- 并发用户 VS TPS
TPS模式(吞吐量模式)是一种更好的方式衡量服务端系统的能力. 基本概念: 并发用户数:简称VU ,指的是现实系统中操作业务的用户,在性能测试工具中,一般称为虚拟用户数(Virutal User),注 ...
- jQuery学习笔记——基本了解
安装 两种方法: 从 jquery.com 下载jQuery. 从 CDN 中载入 jQuery, 如从我的博客中加载 jQuery: <script src="https://blo ...
- 2019软工实践_Alpha(1/6)
队名:955 组长博客:https://www.cnblogs.com/cclong/p/11841141.html 作业博客:https://edu.cnblogs.com/campus/fzu/S ...
- Authentication failure. Retrying - 彻底解决vagrant up时警告
碰到的问题 使用vagrant启动虚拟机时,出现如下警告: vagrant up default: Warning: Authentication failure. Retrying... 原因分析 ...
- Oracle中的统计信息
一.什么是统计信息 统计信息主要是描述数据库中表,索引的大小,规模,数据分布状况等的一类信息.例如,表的行数,块数,平均每行的大小,索引的leaf blocks,索引字段的行数,不同值的大小等,都属于 ...
- 京东 PC 首页 2019 改版前端总结 原创: 何Jason,EC,小屁 凹凸实验室 今天
京东 PC 首页 2019 改版前端总结 原创: 何Jason,EC,小屁 凹凸实验室 今天
- python try except 出现异常时,except 中如何返回异常的信息字符串
https://docs.python.org/3/tutorial/errors.html#handling-exceptions https://docs.python.org/3/library ...
- hdfs 通过命令坏块监测和删除或者地址获取参数做监控
[root@nodecm.oldboy.org.cn /data/dfs/nn/current]# hdfs fsck -list-corruptfileblocksConnecting to nam ...