通过数据库获取省份城市区县的名字

转载请注明出处,谢谢http://blog.csdn.net/harryweasley/article/details/46557807

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

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

省表

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<City> queryProvince() {
		// 创建数据库
		mSDB = SQLiteDatabase
				.openOrCreateDatabase(DATABASE_PATH + dbName, null);
		ArrayList<City> list = new ArrayList<City>();
		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<City> queryCityByProvince(String provinceId) {

		// 创建数据库
		mSDB = SQLiteDatabase
				.openOrCreateDatabase(DATABASE_PATH + dbName, null);
		ArrayList<City> list = new ArrayList<City>();
		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<City> queryDistrictByCity(String cityId) {

		// 创建数据库
		mSDB = SQLiteDatabase
				.openOrCreateDatabase(DATABASE_PATH + dbName, null);
		ArrayList<City> list = new ArrayList<City>();
		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<City> 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();
	}

}

项目下载地址:http://download.csdn.net/detail/harryweasley/8807143

时间: 2024-11-05 13:50:54

通过数据库获取省份城市区县的名字的相关文章

通过IP地址获取省份城市位置信息

private String mResult = null; private String mProvinceName; //省份 private String mChCityName; //城市 private int GET_CITY_SUCCESS = 1; private int GET_CITY_FAILURE = 2; //Handler接收到消息进行处理,取出需要的信息 privateHandler mHandler = new Handler() { public void ha

通过网址或IP获取省份城市

下载数据文件 https://dev.maxmind.com/geoip/geoip2/downloadable/#MaxMind_APIs 添加maven依赖 <dependency> <groupId>com.maxmind.geoip2</groupId> <artifactId>geoip2</artifactId> <version>2.10.0</version> </dependency> jav

学习aiax(javascript)--省份-城市二级下拉联动(POST方式)

1.jsp代码 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"

js根据ip地址获取所在城市

话不多说,直接贴代码! 将这段代码运行一下就OK了: <html xmlns=""> <head runat="server"> <title>根据IP地址获取所在城市</title> <scriptsrc="?format=js"type="text/ecmascript"></script> <script type="text/jav

js通过IP地址获取所在城市

话不多说,直接贴代码! 将这段代码运行一下就OK了: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>根据IP地址获取所在城市</title> <scriptsrc="http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js"type

IOS-根据ip获取当前城市的编号

IOS 通过ip地址获取当前城市的编号 //解析网址通过ip 获取城市天气代码    NSURL *url = [NSURL URLWithString:@"http://61.4.185.48:81/g/"];        //    定义一个NSError对象,用于捕获错误信息    NSError *error;    NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8Stri

PHP 根据IP地址获取所在城市

有这样的需求,需要根据用户的IP地址,定位用户所在的城市. 本文记录性文章,无逻辑性.有这样需求的朋友,可以直接拷贝使用.直接上代码,不需赘述. <?php header('Content-Type:text/html;Charset=utf-8'); function GetIp(){ $realip = ''; $unknown = 'unknown'; if (isset($_SERVER)){ if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) &&

UIPickerView的简单应用——省份/城市选择的实现

UIPickerView的简单应用--省份/城市选择的实现 实现效果如图,左边为省份选择,右边选择省份对应的城市 数据plist形式如图 工程下载地址:工程下载 https://github.com/Nongchaozhe/UIPickerView-Province-city UIPickerView的实现重要还是两个代理协议中方法的实现 - (void)viewDidLoad { [super viewDidLoad]; [self loadData]; _pickView = [[UIPic

UIPickerView简单应用——省份/城市选择实现

UIPickerView的简单应用--省份/城市选择的实现 实现效果如图,左边为省份选择,右边选择省份对应的城市 数据plist形式如图 工程下载地址:工程下载 https://github.com/Nongchaozhe/UIPickerView-Province-city UIPickerView的实现重要还是两个代理协议中方法的实现 - (void)viewDidLoad { [super viewDidLoad]; [self loadData]; _pickView = [[UIPic