本篇博客的主要目的,是介绍怎样将数据库文件保存到手机系统文件,并且可以显示各个省市地的名字。

数据库一共有三个表,他们分别是(后面我将上传整个文件和数据库文件)

省表

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查询市区县_通过数据库获取省份城市区县的名字相关推荐

  1. mysql查询年份列表_【数据库_Mysql】查询当前年份的sql

    1.本年份 SELECT DATE_FORMAT(NOW(), '%Y'); 2.本月份(显示数字) SELECT DATE_FORMAT(NOW(), '%m'); 3.本月份(显示英文) SELE ...

  2. mysql 查询编码转换_字符集介绍及mysql数据库编码转换

    一.字符集介绍: 1.ASCII ASCII是英文American Standard Code for Information Interchange的缩写,美国标准信息交换代码是由美国国家标准学会( ...

  3. mysql 查询时间转换_数据库查询时日期的转换

    首先简单说明一下,laravel框架中查询并打印sql语句的办法,不管任何时候由于sql语句报错时,都可以先打印一下,分析一下是什么原因造成的错误 ①引入laravel框架DB类useIllumina ...

  4. MySQL查询实验报告_实验报告数据库的基本查询'

    <实验报告数据库的基本查询'>由会员分享,可在线阅读,更多相关<实验报告数据库的基本查询'(5页珍藏版)>请在人人文库网上搜索. 1.一.实验目的:通过该实验掌握应用SQL 查 ...

  5. mysql查询重名_同名同姓搜索,同名身份证号码数据库

    同名同姓搜索,同名身份证号码数据库 时间:2020-04-27 14:30:02 不少爸爸妈妈在给婴儿取姓名的时候,会有兴趣知道在全国有多少人重名,希望宝宝的姓名不会跟太多人重复.或者有的小伙伴纯粹想 ...

  6. 【MySQL 第17章_其他数据库日志】

    第17章_其他数据库日志 1.MySQL支持的日志 1.1日志类型 1.2日志的弊端 2.慢查询日志(slow query log) 3.1问题场景 3.2 查看当前状态 3.3 启动日志 3.4 查 ...

  7. mysql查询无限下级_示例php+mysql查询实现无限下级分类树输出

    本文实例讲述了php+mysql查询实现无限下级分类树输出.分享给大家供大家参考,具体如下: 这里介绍的php结合mysql查询无限下级树输出,其实就是无限分类.给各位整理了几个php无限分类的例子. ...

  8. mysql查询会话池_用户会话,数据控件和AM池

    mysql查询会话池 最近,有人问我有关应用程序模块池的有趣问题. 众所周知,AM池包含用户会话引用的应用程序模块实例,这允许会话在后续请求时从池中获取完全相同的AM实例. 如果应用程序中有多个根应用 ...

  9. php mysql查询中文乱码_解决php mysql查询插入中文乱码问题_PHP教程

    解决php mysql查询插入中文乱码问题 一.中文问题其实就是经统一编码了否则就会乱码 1.数据库与php页面编码统一 2.数据库数据表字段与页面编码统一 如果做到上面两种就不存在中文乱码问题了,那 ...

  10. mysql 查询存储过程 速度_查询mysql过程

    MySql 使用explain分析查询 今天写了个慢到哭的查询,想用explain分析下执行计划,后来发现explain也是有局限性的: EXPLAIN不会告诉你关于触发器.存储过程的信息或用户自定义 ...

最新文章

  1. java中什么是空指针异常_java中空指针异常的问题,是怎么回事?请看代码
  2. linux 删除含有关键词的文件_linux 连个文件都删除不了,什么鬼!
  3. 人工智能将如何改进物联网?
  4. 轻量级目标检测大合集
  5. 《React Native移动开发实战》一一3.4 完善商品列表——ListView组件
  6. Windows7下注册OCX的注意事项
  7. Verilog HDL语言设计4个独立的非门
  8. Java与C++有何区别呢?请看以下几点就明白了……
  9. struts2校验框架之Visitor校验器
  10. C - 师--链表的结点插入
  11. linux service命令解析(重要)
  12. 宏基ACER Aspire R3600 REVO离子平台
  13. 全国python工程师有多少_2019年Python工程师的平均薪资是多少?
  14. 计算机网络自顶向下方法 第四章 作业习题答案
  15. 获取计算机特征码,如何查看计算机特征码
  16. 编程猫海龟编辑器(python)_编程猫海龟编辑器
  17. Centos设置打开终端快捷键
  18. html九宫格排列图片,10款jQuery实现的360浏览器九宫格图片拖拽排序
  19. excel录制宏运行规划求解不能运行的问题
  20. vimdiff颜色设置 + vimrc设置 (copied)

热门文章

  1. 下载微信小程序中音频的方法和路径
  2. “运行”窗口命令大全
  3. 曲线与曲面积分公式整理
  4. 仿链家地图找房_iOS地图找房(类似链家、安居客等地图找房)
  5. Paper-----文献引用格式
  6. Lingoes 一款功能强大、简明易用的多语言词典和文本翻译软件
  7. 制作属于自己的个人博客-超详细教程
  8. Python打码API(学习使用)
  9. AJAX网页抓取工具 Krabber 0.2.9正式发布
  10. 【推荐】微信运营书一箩筐,微信运营手册、微信力量