三天完成小应用 大开天气——通过省市县数据库来制作城市选定页面
来源:互联网 发布:游族网络董事长 编辑:程序博客网 时间:2024/05/22 02:23
首先把数据库复制到app 包下 方法如下
/*
* 拷贝数据库
* */
private void copyDB(String dbName) {
File destFile = new File(getFilesDir(), dbName);//要拷贝的目标地址
if (destFile.exists()) {
Toast.makeText(HomeActivity.this, "数据库已经存在", Toast.LENGTH_SHORT).show();
return;
}
FileOutputStream out = null;
InputStream in = null;
try {
in = getAssets().open(dbName);
out = new FileOutputStream(destFile);
int len = 0;
byte[] buffer = new byte[1024];
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
然后新建一个工具类 专门用于从数据库中获取我们需要的数据
这里先show一下数据库
省市县都有对应的id
然后工具类如下
/**
* Created by admin on 2016/5/31.
*/
public class PCZDao {
private static final String PATH =
"data/data/skkk.admin.com.weathergoal/files/PCZ.db";
//注意该路径必须是这个目录data/data目录的文件,否则数据路访问不到
public static List<Province> getProvince() {
//初始化省份列表
ArrayList<Province> allProvince = new ArrayList<>();
//拿到一个数据库对象
SQLiteDatabase database = SQLiteDatabase.openDatabase(PATH,
null, SQLiteDatabase.OPEN_READONLY);
Cursor cursor = database.rawQuery("select province_name,province_id " +
"from weathers group by province_name,province_id " +
"order by province_id"
, null);
while (cursor.moveToNext()) {
Province province = new Province();
province.setpName(cursor.getString(0));
province.setpId(cursor.getString(1));
allProvince.add(province);
}
cursor.close();
database.close();
return allProvince;
}
public static List<City> getCity(String pId) {
//初始化省份列表
ArrayList<City> allCity = new ArrayList<>();
//拿到一个数据库对象
SQLiteDatabase database = SQLiteDatabase.openDatabase(PATH,
null, SQLiteDatabase.OPEN_READONLY);
Cursor cursor = database.rawQuery("select city_name,city_id " +
"from weathers where province_id=? " +
"group by city_name,city_id " +
"order by city_id",
new String[]{pId});
while (cursor.moveToNext()) {
City city=new City();
city.setcName(cursor.getString(0));
city.setcId(cursor.getString(1));
allCity.add(city);
}
cursor.close();
database.close();
return allCity;
}
public static List<Zone> getZone(String cId) {
//初始化省份列表
ArrayList<Zone> allZone = new ArrayList<>();
//拿到一个数据库对象
SQLiteDatabase database = SQLiteDatabase.openDatabase(PATH,
null, SQLiteDatabase.OPEN_READONLY);
Cursor cursor = database.rawQuery("select area_name,area_id from weathers where city_id=?",
new String[]{cId});
while (cursor.moveToNext()) {
Zone zone=new Zone();
zone.setzName(cursor.getString(0));
zone.setzId(cursor.getString(1));
allZone.add(zone);
}
cursor.close();
database.close();
return allZone;
}
}
分别对应三个方法
1
查出所有的省份
2
按照给定的省份id查出对应的市
3
按照给定的市id查出所有的县
很容易对不对
这里有一点需要注意 我这里将所有查找返回项都是List<类>
按照面向对象的思想我们将省市县分别封装成单独的类,包含各自的name和id
省份如下
public class Province {
private String pName;
private String pId;
public String getpId() {
return pId;
}
public void setpId(String pId) {
this.pId = pId;
}
public String getpName() {
return pName;
}
public void setpName(String pName) {
this.pName = pName;
}
@Override
public String toString() {
return "Province{" +
"pId='" + pId + '\'' +
", pName='" + pName + '\'' +
'}';
}
}
剩下俩类似
下面就是开始构建Activity了
首先是省份
布局很简单 一个listview
public class LocationActivity extends AppCompatActivity {
private ListView lvProvince;
private List<Province> allProvince;
private ViewHolder viewHolder;
private PCZDao dao;
private SharedPreferences mPref;
private String provinceName;
private String provinceId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initUI();
getAllProvince();
}
private void initUI() {
setContentView(R.layout.activity_location);
lvProvince = (ListView) findViewById(R.id.lv_province);
mPref = getSharedPreferences("config",MODE_PRIVATE);
lvProvince.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
provinceName = allProvince.get(position).getpName();
provinceId = allProvince.get(position).getpId();
//这里将点击事件中的对应的省份id和name保存到SP中后面会用到
mPref.edit().putString("province_name",provinceName).commit();
mPref.edit().putString("province_id",provinceId).commit();
startActivity(new Intent(LocationActivity.this, CityActivity.class));
Toast.makeText(LocationActivity.this, "您选择了: " + provinceName, Toast.LENGTH_SHORT).show();
finish();
}
});
}
private Handler mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
ProvinceAdapter provinceAdapter =
new ProvinceAdapter(LocationActivity.this, allProvince);
lvProvince.setAdapter(provinceAdapter);
}
};
public void getAllProvince() {
new Thread(){
@Override
public void run() {
//通过工具类获得省份数组
allProvince = dao.getProvince();
mHandler.sendEmptyMessage(0);
}
}.start();
}
private class ProvinceAdapter extends MyLocationAdapter<Province>{
public ProvinceAdapter(LocationActivity context, List<Province> mList) {
super(context, mList);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null){
convertView=View.inflate(LocationActivity.this,
R.layout.item,null);
viewHolder = new ViewHolder();
viewHolder.itemText= (TextView) convertView.findViewById(R.id.tv_name);
convertView.setTag(viewHolder);
}else{
//如果不为空就直接去取
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.itemText.setText(allProvince.get(position).getpName());
return convertView;
}
}
public class ViewHolder {
TextView itemText;
}
}
用好viewholder和复用view可以很好的节约资源
这里继承了一个封装好的adapter 如下
/**
* Created by admin on 2016/5/31.
*/
public abstract class MyLocationAdapter<T> extends BaseAdapter {
private Context context;
private List<T> mList;
public MyLocationAdapter(Context context, List<T> mList) {
this.context = context;
this.mList = mList;
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
}
然后是市列表 还有县列表 类似看看就成
public class CityActivity extends AppCompatActivity {
private ListView lvCity;
private PCZDao dao;
private SharedPreferences mPref;
private String provinceId;
private ViewHolder viewHolder;
private List<City> allCity;
private String provinceName;
private String cityName;
private String cityId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initUI();
getAllCity();
}
private void initUI() {
setContentView(R.layout.activity_city);
lvCity = (ListView) findViewById(R.id.lv_city);
mPref = getSharedPreferences("config", MODE_PRIVATE);
provinceId = mPref.getString("province_id", "");
provinceName = mPref.getString("province_name", "");
lvCity.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
cityName = allCity.get(position).getcName();
cityId = allCity.get(position).getcId();
mPref.edit().putString("city_name",cityName).commit();
mPref.edit().putString("city_id",cityId).commit();
startActivity(new Intent(CityActivity.this, ZoneActivity.class));
Toast.makeText(CityActivity.this, "您选择了: "+provinceName+"-"+cityName, Toast.LENGTH_SHORT).show();
finish();
}
});
}
private Handler mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
CityAdapter cityAdapter =
new CityAdapter(CityActivity.this,allCity);
lvCity.setAdapter(cityAdapter);
}
};
public void getAllCity() {
new Thread(){
@Override
public void run() {
if (provinceId.equals("")){
Toast.makeText(CityActivity.this, "未收到可靠的省份ID", Toast.LENGTH_SHORT).show();
return;
}
allCity = dao.getCity(provinceId);
mHandler.sendEmptyMessage(0);
}
}.start();
}
private class CityAdapter extends MyLocationAdapter<City> {
public CityAdapter(CityActivity cityActivity, List<City> mList) {
super(cityActivity, mList);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null){
convertView=View.inflate(CityActivity.this,
R.layout.item,null);
viewHolder = new ViewHolder();
viewHolder.itemText= (TextView) convertView.findViewById(R.id.tv_name);
convertView.setTag(viewHolder);
}else{
//如果不为空就直接去取
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.itemText.setText(allCity.get(position).getcName());
return convertView;
}
}
public class ViewHolder {
TextView itemText;
}
}
public class ZoneActivity extends AppCompatActivity {
private PCZDao dao;
private SharedPreferences mPref;
private ViewHolder viewHolder;
private ListView lvZone;
private List<Zone> allZone;
private String cityId;
private String cityName;
private String provinceName;
private String zoneName;
private String zoneId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initUI();
getAllZone();
}
private void initUI() {
setContentView(R.layout.activity_zone);
lvZone = (ListView) findViewById(R.id.lv_zone);
mPref = getSharedPreferences("config", MODE_PRIVATE);
cityId = mPref.getString("city_id", "");
cityName = mPref.getString("city_name", "");
provinceName = mPref.getString("province_name", "");
lvZone.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
zoneName = allZone.get(position).getzName();
zoneId = allZone.get(position).getzId();
mPref.edit().putString("zone_name", zoneName).commit();
mPref.edit().putString("zone_id", zoneId).commit();
Toast.makeText(ZoneActivity.this, "您选择了:"
+ provinceName + "-" + cityName + "-" + zoneName,
Toast.LENGTH_SHORT).show();
finish();
}
});
}
private Handler mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
ZoneAdapter zoneAdapter =
new ZoneAdapter(ZoneActivity.this,allZone);
lvZone.setAdapter(zoneAdapter);
}
};
public void getAllZone() {
new Thread(){
@Override
public void run() {
if (cityId.equals("")){
Toast.makeText(ZoneActivity.this, "未收到可靠的城市ID", Toast.LENGTH_SHORT).show();
return;
}
allZone = dao.getZone(cityId);
mHandler.sendEmptyMessage(0);
}
}.start();
}
private class ZoneAdapter extends MyLocationAdapter<Zone> {
public ZoneAdapter(ZoneActivity zoneActivity, List<Zone> mList) {
super(zoneActivity, mList);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null){
convertView=View.inflate(ZoneActivity.this,
R.layout.item,null);
viewHolder = new ViewHolder();
viewHolder.itemText= (TextView) convertView.findViewById(R.id.tv_name);
convertView.setTag(viewHolder);
}else{
//如果不为空就直接去取
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.itemText.setText(allZone.get(position).getzName());
return convertView;
}
}
public class ViewHolder {
TextView itemText;
}
}
当然在最后选择完成县zone之后就跳转到天气界面咯
0 0
- 三天完成小应用 大开天气——通过省市县数据库来制作城市选定页面
- 三天完成小应用 大开天气1——GSON的使用
- (15)通过选择省市,来动态显示城市
- 学习墨迹天气札记之一 —— 城市数据库
- 和风天气城市代码数据库
- 省市二级联动 通过省份选择城市 JS的简单应用 二级下拉列表
- iOS项目开发实战(Swift)—查询天气小应用
- 天气获取通过经纬度或城市信息
- WebServicel通过城市名查询天气
- 天气应用小示例
- 和风天气-城市ID-sqlite数据库构建
- 省市县不刷页面js 完成html代码
- 基于Python的爬虫项目一——城市天气
- select通过text的值来进行选定来进行
- 通过IntentService读取收获地址省市县信息存入数据库
- 通过城市的citycode获取天气数据(逻辑)
- Python——通过while、for、if—else完成一个小程序 学Python的第三天,郑老师让我们写一个计算车费的小程序,还好之前有写小程序的基础,然后很快就完成了,下面是相关内容(^_^)
- 全国省市县数据库
- ubuntu在终端下的字体设置快捷键
- 三天完成小应用 大开天气1——GSON的使用
- 基于android的Socket通信
- JVM整体结构图解
- fsharp处理Excel数据
- 三天完成小应用 大开天气——通过省市县数据库来制作城市选定页面
- python set operation
- OC视频教程29课-第02讲 1、2 Objective-C 类的使用
- 开发中遇到的问题总结
- c++引用高级学习-引用函数指针
- Spring官网改版后下载Spring方法
- 顺序表的实现
- Qt 解析Json
- mssql数据迁移到mysql