package com.wistron.WiGallery.GEO; import Utilities.CSStaticData; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.location.Address; import android.util.Log; /** * Copyright (c) 2011 Wistron SWPC * All rights reserved. * @author Cocoonshu * @date 2012-02-29 11:21:49 * @purpose 数据库辅助类 * @detail 数据库的名称为[geoCache] * 数据库中,每种语言对应一个表,命名规则:TAB_NAME + "_" + TAB_LANG */ public class GEODBAdapter extends SQLiteOpenHelper{ private static final String TAG = "GEODBAdapter"; protected static final int DB_VER = 1; //数据库版本 protected static final String DB_NAME = CSStaticData.DBNAME_GEOINFO; //数据库名称 protected static final String TAB_NAME = "geoContrast"; //数据表名称 protected static String TAB_LANG = ""; //语言 public static final String UID = "uid"; //主键:由经纬度换算而来 public static final String COUNTRY = "country"; //国家 public static final String PROVINCE = "province"; //省 public static final String CITY = "city"; //市 public static final String DISTRICT = "district"; //区 private SQLiteDatabase mDB = null; private Context mContext = null; public GEODBAdapter(Context context, String lang) { super(context, DB_NAME, null, DB_VER); mContext = context; TAB_LANG = lang.toLowerCase(); //定义数据库语言 } @Override public void onCreate(SQLiteDatabase db) { String sqlStr = ""; try{ /* * CREATE TABLE IF NOT EXISTS * geoContrast_ENGLISH(uid INTEGER PRIMARY KEY NOT NULL, * country TEXT, * province TEXT, * city TEXT, * district) */ sqlStr = "CREATE TABLE IF NOT EXISTS " + TAB_NAME + "_" + TAB_LANG + "(" + UID + " INTEGER PRIMARY KEY, " + COUNTRY + " TEXT, " + PROVINCE + " TEXT, " + CITY + " TEXT, " + DISTRICT + " TEXT) "; if(CSStaticData.DEBUG){ Log.w(TAG, "[createTable] " + sqlStr); } db.execSQL(sqlStr); }catch (Exception e) { if(CSStaticData.DEBUG){ e.printStackTrace(); } db.close(); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } public void doCreate(String lang){ String sqlStr = ""; try{ if(mDB == null || !mDB.isOpen()){ mDB = getWritableDatabase(); } if(lang == null){ lang = ""; } TAB_LANG = lang.toLowerCase(); /* * CREATE TABLE IF NOT EXISTS * geoContrast_ENGLISH(uid INTEGER PRIMARY KEY NOT NULL, * country TEXT, * province TEXT, * city TEXT, * district) */ sqlStr = "CREATE TABLE IF NOT EXISTS " + TAB_NAME + "_" + TAB_LANG + "(" + UID + " INTEGER PRIMARY KEY, " + COUNTRY + " TEXT, " + PROVINCE + " TEXT, " + CITY + " TEXT, " + DISTRICT + " TEXT) "; if(CSStaticData.DEBUG){ Log.w(TAG, "[createTable] " + sqlStr); } mDB.execSQL(sqlStr); }catch (Exception e) { if(CSStaticData.DEBUG){ e.printStackTrace(); } close(); } } /** * 清空数据表 * 指定待清空数据表的语言 * @param lang 指定要清空的语言 */ public void clear(String langeuage){ String sqlStr = ""; String lang = ""; try{ if(langeuage != null){ lang = langeuage; } /* * DROP TABLE IF NOT EXISTS * geoContrast_ENGLISH */ sqlStr = "DROP TABLE IF NOT EXISTS " + TAB_NAME + "_" + lang.toLowerCase(); if(CSStaticData.DEBUG){ Log.w(TAG, "[clear] " + sqlStr); } mDB.execSQL(sqlStr); }catch (Exception e) { if(CSStaticData.DEBUG){ e.printStackTrace(); } } } /** * 清空数据库 */ public void clearAll(){ close(); mContext.deleteDatabase(DB_NAME); } /** * 写出所有数据 * @param lang 语言 * @return */ public Cursor list(String langeuage){ Cursor cursor = null; String lang = ""; String sqlStr = ""; try{ if(langeuage != null){ lang = langeuage; } if(mDB == null || !mDB.isOpen()){ mDB = getWritableDatabase(); } /* * SELECT * * FROM geoContrast_ENGLISH */ sqlStr = "SELECT * " + "FROM " + TAB_NAME + "_" + lang.toLowerCase(); if(CSStaticData.DEBUG && false){ Log.w(TAG, "[list] " + sqlStr); } cursor = mDB.rawQuery(sqlStr, null); }catch (SQLException e) { if(CSStaticData.DEBUG){ e.printStackTrace(); } cursor = null; if(mDB != null && mDB.isOpen()){ close(); } } return cursor; } /** * 插入一条数据 * @param uid GPS UID * @param locale 位置信息 * @param lang 语言 * @return 是否插入成功 */ public boolean insert(long uid, GEOAddress address, String langeuage){ boolean state = true; String lang = ""; String sqlStr = ""; try{ if(langeuage != null){ lang = langeuage; } if(mDB == null || !mDB.isOpen()){ mDB = getWritableDatabase(); } /* * INSERT INTO * geoContrast_ENGLISH(uid, country, province, city, district) * VALUES(20155711583, 'CHINA', 'HuBei', 'WuHan', 'JiangXia') */ sqlStr = "INSERT INTO " + TAB_NAME + "_" + lang.toLowerCase() + "(" + UID + ", " + COUNTRY + ", " + PROVINCE + ", " + CITY + ", " + DISTRICT + ") " + "VALUES(" + uid + ", '" + address.getCountryName() + "', '" + address.getLocality() + "', '" + address.getAdminArea() + "', '" + address.getSubAdminArea() + "')"; if(CSStaticData.DEBUG){ Log.w(TAG, "[insert] " + sqlStr); } mDB.execSQL(sqlStr); }catch (SQLException e) { if(CSStaticData.DEBUG){ e.printStackTrace(); } state = false; if(mDB != null && mDB.isOpen()){ close(); } } return state; } /** * 删除一条记录 * @param uid GPS UID * @param lang 语言 * @return 是否删除成功 */ public boolean delete(long uid, String langeuage){ boolean state = true; String lang = ""; String sqlStr = ""; try{ if(langeuage != null){ lang = langeuage; } if(mDB == null || !mDB.isOpen()){ mDB = getWritableDatabase(); } /* * DELETE FROM geoContrast_ENGLISH * WHERE uid = 20155711583 */ sqlStr = "DELETE FROM " + TAB_NAME + "_" + lang.toLowerCase() + " " + "WHERE " + UID + " = " + uid; if(CSStaticData.DEBUG){ Log.w(TAG, "[delete] " + sqlStr); } mDB.execSQL(sqlStr); }catch (SQLException e) { if(CSStaticData.DEBUG){ e.printStackTrace(); } state = false; if(mDB != null && mDB.isOpen()){ close(); } } return state; } /** * 修改一条记录 * @param uid GPS UID * @param address 待重写的位置信息 * @param lang 语言 * @return 是否修改成功 */ public boolean update(long uid, Address address, String langeuage){ boolean state = true; String lang = ""; String sqlStr = ""; try{ if(langeuage != null){ lang = langeuage; } if(mDB == null || !mDB.isOpen()){ mDB = getWritableDatabase(); } /* * UPDATE geoContrast_ENGLISH * SET country = 'CHINA', province = 'ChongQing', city = 'ChongQing', district = 'FuLing' * WHERE uid = 20155711583 */ sqlStr = "UPDATE " + TAB_NAME + "_" + lang.toLowerCase() + " " + "SET " + COUNTRY + " = '" + address.getCountryName() + "', " + PROVINCE + " = '" + address.getLocality() + "', " + CITY + " = '" + address.getAdminArea() + "', " + DISTRICT + " = '" + address.getSubAdminArea() + "' " + "WHERE " + UID + " = " + uid; if(CSStaticData.DEBUG){ Log.w(TAG, "[update] " + sqlStr); } mDB.execSQL(sqlStr); }catch (SQLException e) { if(CSStaticData.DEBUG){ e.printStackTrace(); } state = false; if(mDB != null && mDB.isOpen()){ close(); } } return state; } /** * 查询记录 * @param uid GPS UID * @param lang 语言 * @return 查询到的记录集 */ public Cursor select(long uid, String langeuage){ Cursor cursor = null; String lang = ""; String sqlStr = ""; try{ if(lang != null){ lang = langeuage; } if(mDB == null || !mDB.isOpen()){ try{ mDB = getWritableDatabase(); }catch (SQLException e) { e.printStackTrace(); if(e.getMessage().startsWith("no such table")){ doCreate(lang); }else{ throw e; } } } /* * SELECT * * FROM geoContrast_ENGLISH * WHERE uid = 20155711583 */ sqlStr = "SELECT * " + "FROM " + TAB_NAME + "_" + lang.toLowerCase() + " " + "WHERE " + UID + " = " + uid; if(CSStaticData.DEBUG && false){ Log.w(TAG, "[select] " + sqlStr); } cursor = mDB.rawQuery(sqlStr, null); }catch (SQLException e) { if(CSStaticData.DEBUG){ e.printStackTrace(); } if(cursor != null){ cursor.close(); cursor = null; } if(mDB != null && mDB.isOpen()){ close(); } } return cursor; } /** * 释放数据库 */ public void close(){ if(mDB != null){ if(mDB.isOpen()){ // mDB.close(); super.close(); mDB = null; } } } }