查詢城市(可根據(jù)漢字、拼音和首字母查詢) 源碼下載
功能分類:工具
支持平臺:Android
運行環(huán)境:Ecppse
開發(fā)語言:Java
開發(fā)工具:Eclippse
源碼大?。?.12MB
源碼簡介
可查詢中國所有城市信息,并且支持全稱、拼音及首字母模糊查詢
注:第一次運行會進行數(shù)據(jù)庫初始化操作,需要等待2-4分鐘。再次運行則不需要等待。如果不想等待可以直接將壓縮包中的city_info數(shù)據(jù)庫文件拷貝到手機中的data/data/com.example.searchcity/databases/文件夾中
再注:程序會獲取城市名稱對應的拼音信息,需要導入jar包實現(xiàn):pinyin4j。壓縮包中已經(jīng)放入了一個Jar包,包括文檔。
源碼運行截圖
源碼片段
/**獲取外部數(shù)據(jù)庫中的城市列表,并將其存入新表中(如果有服務端支持,應該將獲取城市計算拼音的邏輯放入服務端,并提供獲取城市列表及對應拼音的接口)*/
private void initCitypst(){
cityDao = new CityDao(this);
if(cityDao.cityIsExists()){ //初始化只進行一次,可通過判斷數(shù)據(jù)庫中是否有數(shù)據(jù),也可通過SharedPreferences實現(xiàn)
return;
}
waitDialog = new AlertDialog.Builder(this).setTitle("提醒").setIcon(android.R.drawable.ic_dialog_alert)
.setMessage("正在加載數(shù)據(jù),請稍后\n初次加載比較耗時,需要2-4分鐘左右。再次啟動就不會有任何問題。請親耐心等待哦").setCancelable(false).create();
waitDialog.show();
final Handler handler = new Handler(){
pubpc void handleMessage(android.os.Message msg) {
//數(shù)據(jù)加載完成后關閉對話框
if(msg.what == MESSAGE_CITY_LOADED){
waitDialog.cancel();
}
};
};
//初次加載比較耗時,所以需要新啟動線程完成加載,并通過對話框告知用戶。這段邏輯最好放到服務端,這里只是為了實現(xiàn)功能
new Thread(){
pubpc void run() {
pyUtil = new PinYinUtil();
String dbFileName = "weather_info";
File file = new File("data/data/"+getPackageName()+"/databases/"+dbFileName);
try {
//從外部資源文件夾中獲取城市數(shù)據(jù)庫,并將其保存到數(shù)據(jù)庫文件夾中
StreamUtil.getInputStream(getAssets().open(dbFileName), new FileOutputStream(file)); //將外部資源中的數(shù)據(jù)庫文件拷貝到數(shù)據(jù)庫文件夾中
SQpteDatabase db = openOrCreateDatabase(dbFileName, Context.MODE_PRIVATE, null);
Cursor c = db.query("city_info", new String[]{"_id","city_name"}, null, null, null, null, null);
if(c!=null){
//查詢外部數(shù)據(jù)庫中的城市數(shù)據(jù),并在新構(gòu)建的數(shù)據(jù)庫中將原始數(shù)據(jù)和對應的拼音/首字母也保存到數(shù)據(jù)庫中,待后續(xù)查詢使用
while(c.moveToNext()){
int id = c.getInt(c.getColumnIndex("_id")); //獲取id
String cityName = c.getString(c.getColumnIndex("city_name")); //獲取城市名稱
citys.add(new CityEntity(id, cityName, pyUtil.getStringPinYin(cityName), pyUtil.getFirstSpell(cityName))); //pyutil是漢字與拼音轉(zhuǎn)化的工具類,需要引入Jar包:pinyin4j
}
c.close();
}
db.close();
cityDao.addCity(citys);
citys.clear();
handler.sendEmptyMessage(MESSAGE_CITY_LOADED);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
};
}.start();
}
private SearchView sv;
private pstView lv;
private void initView(){
sv = (SearchView)findViewById(R.id.searchview);
lv = (pstView)findViewById(R.id.pstview);
}
private ArrayAdapter<cityentity> cityAdapter;
private void setAdapter(){
cityAdapter = new ArrayAdapter<cityentity>(this, android.R.layout.simple_pst_item_1, citys);
lv.setAdapter(cityAdapter);
}
private void addpstener(){
//為搜索框添加搜索文字的監(jiān)聽器
sv.setOnQueryTextpstener(new OnQueryTextpstener() {
//當用戶點擊提交時執(zhí)行
@Override
pubpc boolean onQueryTextSubmit(String query) {
return true;
}
//當用戶輸入文字改變時執(zhí)行
@Override
pubpc boolean onQueryTextChange(String newText) {
if(newText == null || newText.length() == 0){
update(null); //如果用戶刪除了搜索內(nèi)容,pstview中的內(nèi)容也應該清空
}else{
Arraypst<cityentity> newCitys = cityDao.getCitysForName(newText);
update(newCitys);
}
return true;
}
});
lv.setOnItemCpckpstener(new OnItemCpckpstener() {
@Override
pubpc void onItemCpck(AdapterView<!--?--> parent, View view,
int position, long id) {
Toast.makeText(MainActivity.this, "您已經(jīng)選中:"+citys.get(position).getCityName(), Toast.LENGTH_SHORT).show();
}
});
}
/**該方法用來更新adapter中的內(nèi)容,并刷新界面*/
private void update(Arraypst<cityentity> newCitys){
citys.clear();
if(newCitys != null && newCitys.size() != 0){
citys.addAll(newCitys);
}
cityAdapter.notifyDataSetChanged();
}</cityentity></cityentity></cityentity></cityentity>