其实前面的Android 读取assets目录下的db文件,Android之高德地图定位,Android之应用市场评分这三篇文章都是天气预报之中的功能,这篇文章主要写读取db_weather.db中的hotCity和搜索城市,以及添加城市到my_city.db中。
package com.lzh.weatherforecast.Util;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.lzh.weatherforecast.Bean.CityInfo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class DBUtil {
private String DB_NAME = "db_weather.db";
private Context mContext;
public DBUtil(Context mContext) {
this.mContext = mContext;
}
//把assets目录下的db文件复制到dbpath下
public void initDBManager(String packName) {
String dbPath = "/data/data/" + packName
+ "/" + DB_NAME;
if (!new File(dbPath).exists()) {
try {
FileOutputStream out = new FileOutputStream(dbPath);
InputStream in = mContext.getAssets().open("db_weather.db");
byte[] buffer = new byte[1024];
int readBytes = 0;
while ((readBytes = in.read(buffer)) != -1)
out.write(buffer, 0, readBytes);
in.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public SQLiteDatabase getSqLiteDatabase(String packName) {
String dbPath = "/data/data/" + packName
+ "/" + DB_NAME;
return SQLiteDatabase.openOrCreateDatabase(dbPath, null);
}
//查询普通city集合
public CityInfo queryCommonCity(SQLiteDatabase sqliteDB, String[] columns, String selection, String[] selectionArgs) {
CityInfo city = null;
try {
String table = "citys";
Cursor cursor = sqliteDB.query(table, columns, selection, selectionArgs, null, null, null);
if (cursor.moveToFirst()) {
String name = cursor.getString(cursor
.getColumnIndex("name"));
String cityID = cursor.getString(cursor.getColumnIndex("city_num"));
city = new CityInfo(name, cityID);
cursor.moveToNext();
cursor.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return city;
}
//查询普通city
public List<CityInfo> queryCommonCityList(SQLiteDatabase sqliteDB, String[] columns, String selection, String[] selectionArgs) {
List<CityInfo> cityInfoList = new ArrayList<CityInfo>();
CityInfo cityInfo = null;
try {
String table = "citys";
Cursor cursor = sqliteDB.query(table, columns, selection, selectionArgs, null, null, null);
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
String name = cursor.getString(cursor
.getColumnIndex("name"));
String cityID = cursor.getString(cursor.getColumnIndex("city_num"));
cityInfo = new CityInfo(name, cityID);
cityInfoList.add(cityInfo);
}
cursor.close();
} catch (Exception e) {
e.printStackTrace();
}
return cityInfoList;
}
//查询hotcity
public List<CityInfo> queryHotCity(SQLiteDatabase sqliteDB) {
List<CityInfo> cityInfoList = new ArrayList<CityInfo>();
try {
String table = "hotcity";
Cursor cursor = sqliteDB.query(table, null, null, null, null, null, null);
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
String name = cursor.getString(cursor
.getColumnIndex("name"));
String cityID = cursor.getString(cursor.getColumnIndex("posID"));
CityInfo cityInfo = new CityInfo(name, cityID);
cityInfoList.add(cityInfo);
}
cursor.close();
} catch (Exception e) {
e.printStackTrace();
}
return cityInfoList;
}
}
把添加的城市的相关信息在my_city表中保存
package com.lzh.weatherforecast.DB;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "my_city.db";
private static final int version = 2;
private String createTable = "create table my_city (" + "_id integer primary key autoincrement,name vachar,city_id vacher )";
private Context mContext;
public DBHelper(Context context) {
super(context, DB_NAME, null, version);
this.mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建数据库
db.execSQL(createTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
package com.lzh.weatherforecast.DB;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.lzh.weatherforecast.Bean.CityInfo;
import java.util.ArrayList;
import java.util.List;
public class DBManger {
private DBHelper dbHelper;
private SQLiteDatabase sqLiteDatabase;
private List<CityInfo> list;
private String tableName = "my_city";
public DBManger(Context context) {
dbHelper = new DBHelper(context);
sqLiteDatabase = dbHelper.getWritableDatabase();
}
//添加城市到表中
public long insert(String nullColumnHack, ContentValues values) {
return sqLiteDatabase.insert(tableName, nullColumnHack, values);
}
//删除已经添加的城市
public void delete(String whereClause, String[] whereArgs) {
sqLiteDatabase.delete(tableName, whereClause, whereArgs);
}
//查询my_city表中的城市信息,在显示添加城市的天气中用到
public List<CityInfo> query(String[] columns, String selection, String[] selectionArgs) {
List<CityInfo> cityInfoList = new ArrayList<CityInfo>();
CityInfo cityInfo = null;
Cursor cursor = sqLiteDatabase.query(tableName, columns, selection, selectionArgs, null, null, "_id desc");
if (cursor != null) {
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
String cityID = cursor.getString(cursor.getColumnIndex("city_id"));
cityInfo = new CityInfo(name, cityID);
cityInfoList.add(cityInfo);
}
}
cursor.close();
return cityInfoList;
}
//查询my_city表中单个城市,用来判断城市是否已经被添加
public CityInfo querySingle(String[] columns, String selection, String[] selectionArgs) {
CityInfo cityInfo = null;
Cursor cursor = sqLiteDatabase.query(tableName, columns, selection, selectionArgs, null, null, null);
cursor.getCount();
if (cursor != null && cursor.moveToFirst()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
String cityID = cursor.getString(cursor.getColumnIndex("city_id"));
cityInfo = new CityInfo(name, cityID);
}
cursor.close();
return cityInfo;
}
}
这里用到了Android自定义标题栏,但是有所修改,在这里还是把相应的代码贴出来
package com.lzh.weatherforecast.Widget;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.lzh.weatherforecast.R;
public class TitleLayout extends RelativeLayout {
private Context context;
private RelativeLayout relativeLayout;
private ImageView leftImageView, rightImageView;
private TextView titleTextView, rightTextView;
private TitleOnClickListener titleOnClickListener;
public TitleLayout(Context context) {
super(context);
this.context = context;
initView();
}
public TitleLayout(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
initView();
}
public TitleLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
initView();
}
//初始化view
private void initView() {
View view = LayoutInflater.from(context).inflate(R.layout.common_title_layout, null);
leftImageView = (ImageView) view.findViewById(R.id.left_imageview);
rightTextView = (TextView) view.findViewById(R.id.right_textview);
titleTextView = (TextView) view.findViewById(R.id.title);
relativeLayout = (RelativeLayout) view.findViewById(R.id.titlelayout);
rightImageView = (ImageView) view.findViewById(R.id.right_image);
this.addView(view);
}
//给右边的imageView设置bg
public void setRightImageViewBg(int resid) {
rightImageView.setBackgroundResource(resid);
}
//设置右边的imageView是否可见
public void setRightImageViewVisibility(int visibility) {
rightImageView.setVisibility(visibility);
}
// 右边图片点击事件
public void setRightImageViewListener(final TitleOnClickListener titleOnClickListener) {
rightImageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
titleOnClickListener.OnClick();
}
});
}
//设置标题栏背景颜色
public void setTitleBackgroundColor(int color) {
relativeLayout.setBackgroundColor(color);
}
//设置标题
public void setTitleMessage(String title) {
titleTextView.setText(title);
}
//标题文字大小
public void setTitleSize(float size) {
titleTextView.setTextSize(size);
}
//设置左边图片
public void setLeftImage(Drawable drawable) {
leftImageView.setImageDrawable(drawable);
}
//设置右边文字
public void setRightTextMessage(String message) {
rightTextView.setText(message);
}
//左边图片是否隐藏
public void setLeftVisibility(int visibility) {
leftImageView.setVisibility(visibility);
}
//右边图片是否隐藏
public void setRightVisibility(int visibility) {
rightTextView.setVisibility(visibility);
}
//标题文字是否隐藏
public void setTitleVisibility(int visibility) {
titleTextView.setVisibility(visibility);
}
//设置标题文字颜色
public void setTitleColor(int color) {
titleTextView.setTextColor(color);
}
//左边点击事件
public void setLeftListener(final TitleOnClickListener titleOnClickListener) {
leftImageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
titleOnClickListener.OnClick();
}
});
}
public void setRightListener(final TitleOnClickListener titleOnClickListener) {
rightTextView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
titleOnClickListener.OnClick();
}
});
}
public interface TitleOnClickListener {
void OnClick();
}
}
到这里所有的准备工作都已经做好了,现在开始在Activity中显示hotCity和搜索city已经添加city
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/background"
android:fitsSystemWindows="true"
android:orientation="vertical">
<com.lzh.weatherforecast.Widget.TitleLayout
android:id="@+id/title_layout"
android:layout_width="fill_parent"
android:layout_height="@dimen/size_132px"></com.lzh.weatherforecast.Widget.TitleLayout>
<EditText
android:id="@+id/key"
android:layout_width="match_parent"
android:layout_height="@dimen/size_96px"
android:layout_marginLeft="@dimen/size_57px"
android:layout_marginRight="@dimen/size_57px"
android:layout_marginTop="@dimen/size_57px"
android:background="@drawable/bg_floating"
android:drawableRight="@drawable/btn_del"
android:hint="@string/search_tips"
android:paddingLeft="@dimen/size_21px"
android:paddingRight="@dimen/size_21px" />
<TextView
android:id="@+id/title_tips"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/size_21px"
android:layout_marginLeft="@dimen/size_57px"
android:layout_marginTop="@dimen/size_57px"
android:text="@string/choose_hotcity"
android:textColor="@color/black"
android:textSize="@dimen/size_48px" />
<TextView
android:layout_width="match_parent"
android:layout_height="@dimen/size_1px"
android:background="@color/line_background" />
<GridView
android:id="@+id/gridview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/size_57px"
android:layout_marginRight="@dimen/size_57px"
android:layout_marginTop="@dimen/size_21px"
android:listSelector="@color/transparent"
android:numColumns="3"
android:scrollbars="none" />
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"></ListView>
<TextView
android:id="@+id/search_result"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/size_57px"
android:layout_marginTop="@dimen/size_57px"
android:textColor="@color/black"
android:textSize="@dimen/size_48px"
android:visibility="gone" />
</LinearLayout>
hotcity显示在gridView中,用户搜索出来的结果显示在ListView中,Activity处理的相关代码如下:
package com.lzh.weatherforecast.Activity;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.MotionEvent;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.lzh.weatherforecast.Adapter.AddLocationAdapter;
import com.lzh.weatherforecast.Adapter.SearchCityAdapter;
import com.lzh.weatherforecast.Bean.CityInfo;
import com.lzh.weatherforecast.DB.DBManger;
import com.lzh.weatherforecast.R;
import com.lzh.weatherforecast.Util.DBUtil;
import com.lzh.weatherforecast.Util.TitleUtil;
import com.lzh.weatherforecast.Widget.CustomDialog;
import com.lzh.weatherforecast.Widget.TitleLayout;
import java.util.ArrayList;
import java.util.List;
public class AddLocationActivity extends Activity implements View.OnClickListener {
private TitleLayout titleLayout;
private EditText keyEditText;
private GridView gridView;
private DBUtil dbUtil;
private List<CityInfo> cityInfoList;
private CityInfo cityInfo;
private SQLiteDatabase sqLiteDatabase;
private AddLocationAdapter adapter;
private TitleUtil titleUtil;
private List<CityInfo> hotCityInfoList;
private ListView listView;
private SearchCityAdapter searchCityAdapter;
private TextView searchResultTitlte, titleTips;
private static final int ITEM_CLICK = 0x01;
private CustomDialog dialog;
private DBManger dbManger;
private int choosePosition;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case ITEM_CLICK:
initSearchList(cityInfoList);
choosePosition = msg.arg1;
cityInfoList.get(msg.arg1).isCheck = true;
searchCityAdapter.notifyDataSetChanged();
showDiaolg(cityInfoList.get(msg.arg1).name, "common");
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_location);
initView();
setListener();
}
private void initView() {
dialog = new CustomDialog(this);
dbManger = new DBManger(this);
titleUtil = new TitleUtil(this);
titleUtil.initTitle();
titleLayout = (TitleLayout) findViewById(R.id.title_layout);
titleLayout.setTitleMessage(getResources().getString(R.string.add_address));
keyEditText = (EditText) findViewById(R.id.key);
titleLayout.setRightTextMessage(getString(R.string.search));
gridView = (GridView) findViewById(R.id.gridview);
listView = (ListView) findViewById(R.id.listview);
titleTips = (TextView) findViewById(R.id.title_tips);
searchResultTitlte = (TextView) findViewById(R.id.search_result);
hotCityInfoList = new ArrayList<CityInfo>();
dbUtil = new DBUtil(this);
sqLiteDatabase = dbUtil.getSqLiteDatabase(getPackageName());
hotCityInfoList = dbUtil.queryHotCity(sqLiteDatabase);
adapter = new AddLocationAdapter(hotCityInfoList, this);
gridView.setAdapter(adapter);
titleLayout.setLeftListener(new TitleLayout.TitleOnClickListener() {
@Override
public void OnClick() {
finish();
}
});
}
private void setListener() {
titleLayout.setRightListener(new TitleLayout.TitleOnClickListener() {
@Override
public void OnClick() {
hideKeyBoard(titleLayout);
if (cityInfoList != null) {
cityInfoList.clear();
}
titleTips.setText(getResources().getString(R.string.choose_city));
String key = keyEditText.getText().toString().trim();
if (null != key && !key.equals("")) {
gridView.setVisibility(View.GONE);
listView.setVisibility(View.VISIBLE);
cityInfoList = searchCity(key);
updateListView(cityInfoList);
} else {
showToast(getResources().getString(R.string.search_tips));
}
}
});
//点击右边的删除图标删除输入框文字信息
keyEditText.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Drawable drawable = keyEditText.getCompoundDrawables()[2];
if (drawable == null)
return false;
if (event.getAction() != MotionEvent.ACTION_UP)
return false;
if (event.getX() > keyEditText.getWidth() - keyEditText.getPaddingRight()
- drawable.getIntrinsicWidth()) {
keyEditText.setText("");
}
return false;
}
});
keyEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length() == 0 || s.equals(getResources().getString(R.string.search_tips))) {
listView.setVisibility(View.GONE);
gridView.setVisibility(View.VISIBLE);
titleTips.setText(getResources().getString(R.string.choose_hotcity));
searchResultTitlte.setVisibility(View.GONE);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
choosePosition = position;
showDiaolg(hotCityInfoList.get(position).name, "hotcity");
}
});
}
private void initSearchList(List<CityInfo> list) {
for (CityInfo cityInfo : list) {
cityInfo.isCheck = false;
}
}
@Override
public void onClick(View v) {
}
private void updateListView(List<CityInfo> list) {
if (cityInfoList.size() == 0) {
searchResultTitlte.setVisibility(View.VISIBLE);
searchResultTitlte.setText(getResources().getString(R.string.not_find_about_city));
} else {
searchResultTitlte.setVisibility(View.GONE);
searchCityAdapter = new SearchCityAdapter(list, AddLocationActivity.this, mHandler);
listView.setAdapter(searchCityAdapter);
}
}
//模糊查询city
private List<CityInfo> searchCity(String key) {
String[] columns = new String[]{"name", "city_num"};
String selection = " name like ?";
String[] selectionArgs = new String[]{"%" + key + "%"};
return dbUtil.queryCommonCityList(sqLiteDatabase, columns, selection, selectionArgs);
}
//隐藏键盘
private void hideKeyBoard(View view) {
InputMethodManager imm = (InputMethodManager) view
.getContext().getSystemService(
Context.INPUT_METHOD_SERVICE);
if (imm.isActive()) {
imm.hideSoftInputFromWindow(
view.getApplicationWindowToken(), 0);
}
}
private void showDiaolg(String content, String type) {
dialog.show();
dialog.setTitleMessage(getResources().getString(R.string.notification));
dialog.setContentText(content);
if (type.equals("hotcity")) {
cityInfo = hotCityInfoList.get(choosePosition);
} else {
cityInfo = cityInfoList.get(choosePosition);
}
dialog.setCancleBtnOnClickListener(new CustomDialog.OnClickListener() {
@Override
public void onClick() {
dialog.dismiss();
}
});
dialog.setOkBtnOnClickListener(new CustomDialog.OnClickListener() {
@Override
public void onClick() {
if (searchAlreadyCity(cityInfo.cityID)) {
ContentValues contentValues = new ContentValues();
contentValues.put("name", cityInfo.name);
contentValues.put("city_id", cityInfo.cityID);
long id = dbManger.insert(null, contentValues);
if (id != -1) {
showToast(getResources().getString(R.string.add_location_success));
} else {
showToast(getResources().getString(R.string.add_location_failed));
}
} else {
showToast(getResources().getString(R.string.already_exist));
}
dialog.dismiss();
}
});
}
//模糊查询city
private boolean searchAlreadyCity(String cityID) {
String[] columns = new String[]{"name", "city_id"};
String selection = " city_id=?";
String[] selectionArgs = new String[]{cityID};
if (dbManger.querySingle(columns, selection, selectionArgs) != null) {
return false;
}
return true;
}
private void showToast(String message) {
Toast.makeText(AddLocationActivity.this, message, Toast.LENGTH_SHORT).show();
}
}
现在显示这个功能就已经完成了,运行图如下: