mysql查询市区县_通过数据库获取省份城市区县的名字
本篇博客的主要目的,是介绍怎样将数据库文件保存到手机系统文件,并且可以显示各个省市地的名字。
数据库一共有三个表,他们分别是(后面我将上传整个文件和数据库文件)
省表
CREATE TABLE IF NOT EXISTS `fs_province` (
`ProvinceID` bigint(20) NOT NULL,
`ProvinceName` varchar(50) DEFAULT NULL,
`DateCreated` datetime DEFAULT NULL,
`DateUpdated` datetime DEFAULT NULL,
PRIMARY KEY (`ProvinceID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
城市表
CREATE TABLE IF NOT EXISTS `fs_city` (
`CityID` bigint(20) NOT NULL,
`CityName` varchar(50) DEFAULT NULL,
`ZipCode` varchar(50) DEFAULT NULL,
`ProvinceID` bigint(20) DEFAULT NULL,
`DateCreated` datetime DEFAULT NULL,
`DateUpdated` datetime DEFAULT NULL,
PRIMARY KEY (`CityID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
县区表
CREATE TABLE IF NOT EXISTS `fs_district` (
`DistrictID` bigint(20) NOT NULL,
`DistrictName` varchar(50) DEFAULT NULL,
`CityID` bigint(20) DEFAULT NULL,
`DateCreated` datetime DEFAULT NULL,
`DateUpdated` datetime DEFAULT NULL,
PRIMARY KEY (`DistrictID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
注意:
省份表和城市表中,都有北京,上海,重庆,天津这四个城市,所以要自己判断一下。
先看下效果图:
我们将二进制的数据库文件放入工程的res/raw下面,如图所示:
整个程序的主要功能,我都封装在了CityInfoDataSupport2这个类中。
package com.example.province;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;
public class CityInfoDataSupport2 {
private static CityInfoDataSupport2 cityInfoDataSupport;
public static final String PACKAGE_NAME = "com.example.province";
/**
* 数据库在手机系统内存里的路径
*/
private static String DATABASE_PATH = "/data"
+ Environment.getDataDirectory() + "/"+PACKAGE_NAME + "/databases/";
/**
* 数据库的名称
*/
public static final String dbName = "mzk_db";
private SQLiteDatabase mSDB;
public static CityInfoDataSupport2 getInstance(Context context) {
initDataBase(context);
if (cityInfoDataSupport == null) {
cityInfoDataSupport = new CityInfoDataSupport2();
}
return cityInfoDataSupport;
}
/**
* 初试化数据库
*/
private static void initDataBase(Context context) {
boolean dbExist = checkDataBase();
if (dbExist) {
} else {
// 如果不存在,则将raw里的数据存入手机sd卡
copyDataBase(context);
}
}
/**
* 复制数据库到手机指定文件夹下
*
* @throws IOException
*/
private static void copyDataBase(Context context) {
String databaseFilenames = DATABASE_PATH + dbName;
File dir = new File(DATABASE_PATH);
FileOutputStream os = null;
InputStream is = null;
// 判断文件夹是否存在,不存在就创建一个
if (!dir.exists()) {
dir.mkdirs();
}
try {
// 得到数据库的输出流
os = new FileOutputStream(databaseFilenames);
// 得到数据文件的输入流
is = context.getResources().openRawResource(R.raw.mzk_db);
byte[] buffer = new byte[8192];
int count = 0;
while ((count = is.read(buffer)) != -1) {
os.write(buffer, 0, count);
os.flush();
}
// 之所以不在这里初始化,是因为这边是静态的方法,而mSDB并没有设置为静态的,也不推荐设为静态的
// mSDB = SQLiteDatabase.openOrCreateDatabase(DATABASE_PATH +
// dbName, null);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
os.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 判断数据库是否存在
*
* @return
*/
private static boolean checkDataBase() {
SQLiteDatabase checkDB = null;
String databaseFilename = DATABASE_PATH + dbName;
// 要自己加上try catch方法
try {
// 返回最新的数据库
checkDB = SQLiteDatabase.openDatabase(databaseFilename, null,
SQLiteDatabase.OPEN_READONLY);
} catch (SQLiteException e) {
// TODO: handle exception
}
if (checkDB != null) {
checkDB.close();
}
// 如果checkDB为null,则没有数据库,返回false
return checkDB == null ? false : true;
}
/**
* 查询所有省份的信息
*
* @return 省份信息
*/
public ArrayList queryProvince() {
// 创建数据库
mSDB = SQLiteDatabase
.openOrCreateDatabase(DATABASE_PATH + dbName, null);
ArrayList list = new ArrayList();
String sql = "select * from fs_province";
Cursor cursor = mSDB.rawQuery(sql, null);
while (cursor.moveToNext()) {
City city = new City();
String id = cursor.getString(cursor.getColumnIndex("ProvinceID"));
String name = cursor.getString(cursor
.getColumnIndex("ProvinceName"));
city.setName(name);
city.setId(id);
list.add(city);
}
if (cursor != null) {
cursor.close();
}
return list;
}
/**
* 通过省份来查找城市
*
* @param provinceId
* 省份的id
* @return 该省的所有城市
*/
public ArrayList queryCityByProvince(String provinceId) {
// 创建数据库
mSDB = SQLiteDatabase
.openOrCreateDatabase(DATABASE_PATH + dbName, null);
ArrayList list = new ArrayList();
String sql = "select * from fs_city where ProvinceID=" + provinceId;
Cursor cursor = mSDB.rawQuery(sql, null);
while (cursor.moveToNext()) {
City city = new City();
String id = cursor.getString(cursor.getColumnIndex("CityID"));
String name = cursor.getString(cursor.getColumnIndex("CityName"));
city.setName(name);
city.setId(id);
list.add(city);
}
if (cursor != null) {
cursor.close();
}
return list;
}
/**
* 通过城市来查找县区
*
* @param provinceId
* 省份的id
* @return 该省的所有城市
*/
public ArrayList queryDistrictByCity(String cityId) {
// 创建数据库
mSDB = SQLiteDatabase
.openOrCreateDatabase(DATABASE_PATH + dbName, null);
ArrayList list = new ArrayList();
String sql = "select * from fs_district where CityID=" + cityId;
Cursor cursor = mSDB.rawQuery(sql, null);
while (cursor.moveToNext()) {
City city = new City();
String id = cursor.getString(cursor.getColumnIndex("DistrictID"));
String name = cursor.getString(cursor
.getColumnIndex("DistrictName"));
city.setName(name);
city.setId(id);
list.add(city);
}
if (cursor != null) {
cursor.close();
}
return list;
}
public void closeDataBase() {
if (mSDB != null) {
mSDB.close();
}
}
}
这个类中,将程序中的数据库二进制文件复制到了手机系统内存中。代码中都有很详细的注释,我在这里就不多说了。
接下来就是各个Activity的内容了,都很简单,我就贴一个吧,之后我将上传整个程序。
package com.example.province;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
/**
* 省份的名字,其中北京,上海,天津,重庆,香港,澳门这六个是特殊的例子
* @author lgx
*
*/
public class MainActivity extends Activity {
ArrayList province;
ListView province_list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
province_list = (ListView) findViewById(R.id.province_list);
province = CityInfoDataSupport2.getInstance(this).queryProvince();
TestAdapter adapter = new TestAdapter(this, province);
province_list.setAdapter(adapter);
province_list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view,
int position, long id) {
String ProviceId = province.get(position).getId();
String proviceName = province.get(position).getName();
if (proviceName.equals("北京") || proviceName.equals("天津")
|| proviceName.equals("上海") || proviceName.equals("重庆")) {
Intent intent = new Intent(MainActivity.this,
DistrictActivity.class);
intent.putExtra("pcode", ProviceId);
startActivity(intent);
} else {
Intent intent = new Intent(MainActivity.this,
CityActivity.class);
intent.putExtra("pcode", ProviceId);
startActivity(intent);
}
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
// CityInfoDataSupport.getInstance(this).close();
}
}
mysql查询市区县_通过数据库获取省份城市区县的名字相关推荐
- mysql查询年份列表_【数据库_Mysql】查询当前年份的sql
1.本年份 SELECT DATE_FORMAT(NOW(), '%Y'); 2.本月份(显示数字) SELECT DATE_FORMAT(NOW(), '%m'); 3.本月份(显示英文) SELE ...
- mysql 查询编码转换_字符集介绍及mysql数据库编码转换
一.字符集介绍: 1.ASCII ASCII是英文American Standard Code for Information Interchange的缩写,美国标准信息交换代码是由美国国家标准学会( ...
- mysql 查询时间转换_数据库查询时日期的转换
首先简单说明一下,laravel框架中查询并打印sql语句的办法,不管任何时候由于sql语句报错时,都可以先打印一下,分析一下是什么原因造成的错误 ①引入laravel框架DB类useIllumina ...
- MySQL查询实验报告_实验报告数据库的基本查询'
<实验报告数据库的基本查询'>由会员分享,可在线阅读,更多相关<实验报告数据库的基本查询'(5页珍藏版)>请在人人文库网上搜索. 1.一.实验目的:通过该实验掌握应用SQL 查 ...
- mysql查询重名_同名同姓搜索,同名身份证号码数据库
同名同姓搜索,同名身份证号码数据库 时间:2020-04-27 14:30:02 不少爸爸妈妈在给婴儿取姓名的时候,会有兴趣知道在全国有多少人重名,希望宝宝的姓名不会跟太多人重复.或者有的小伙伴纯粹想 ...
- 【MySQL 第17章_其他数据库日志】
第17章_其他数据库日志 1.MySQL支持的日志 1.1日志类型 1.2日志的弊端 2.慢查询日志(slow query log) 3.1问题场景 3.2 查看当前状态 3.3 启动日志 3.4 查 ...
- mysql查询无限下级_示例php+mysql查询实现无限下级分类树输出
本文实例讲述了php+mysql查询实现无限下级分类树输出.分享给大家供大家参考,具体如下: 这里介绍的php结合mysql查询无限下级树输出,其实就是无限分类.给各位整理了几个php无限分类的例子. ...
- mysql查询会话池_用户会话,数据控件和AM池
mysql查询会话池 最近,有人问我有关应用程序模块池的有趣问题. 众所周知,AM池包含用户会话引用的应用程序模块实例,这允许会话在后续请求时从池中获取完全相同的AM实例. 如果应用程序中有多个根应用 ...
- php mysql查询中文乱码_解决php mysql查询插入中文乱码问题_PHP教程
解决php mysql查询插入中文乱码问题 一.中文问题其实就是经统一编码了否则就会乱码 1.数据库与php页面编码统一 2.数据库数据表字段与页面编码统一 如果做到上面两种就不存在中文乱码问题了,那 ...
- mysql 查询存储过程 速度_查询mysql过程
MySql 使用explain分析查询 今天写了个慢到哭的查询,想用explain分析下执行计划,后来发现explain也是有局限性的: EXPLAIN不会告诉你关于触发器.存储过程的信息或用户自定义 ...
最新文章
- java中什么是空指针异常_java中空指针异常的问题,是怎么回事?请看代码
- linux 删除含有关键词的文件_linux 连个文件都删除不了,什么鬼!
- 人工智能将如何改进物联网?
- 轻量级目标检测大合集
- 《React Native移动开发实战》一一3.4 完善商品列表——ListView组件
- Windows7下注册OCX的注意事项
- Verilog HDL语言设计4个独立的非门
- Java与C++有何区别呢?请看以下几点就明白了……
- struts2校验框架之Visitor校验器
- C - 师--链表的结点插入
- linux service命令解析(重要)
- 宏基ACER Aspire R3600 REVO离子平台
- 全国python工程师有多少_2019年Python工程师的平均薪资是多少?
- 计算机网络自顶向下方法 第四章 作业习题答案
- 获取计算机特征码,如何查看计算机特征码
- 编程猫海龟编辑器(python)_编程猫海龟编辑器
- Centos设置打开终端快捷键
- html九宫格排列图片,10款jQuery实现的360浏览器九宫格图片拖拽排序
- excel录制宏运行规划求解不能运行的问题
- vimdiff颜色设置 + vimrc设置 (copied)