Android上實現一個簡單的天氣預報APP(八) 從資料庫讀取城市資料
阿新 • • 發佈:2019-02-14
學習參考資源:https://www.gitbook.com/book/zhangqx/mini-weather/details
前面我們已經實現了今日天氣的主介面佈局,並可以從網路上實時獲取天氣資料更新到介面上,並通過按鈕切入選擇城市介面。接下來,我們通過讀取資料庫檔案獲取城市列表。
思路:
建立一個Application,Application的建立是在Activity之前,因此,可以在Activity啟動前載入好我們從資料庫讀取的城市列表。
1)現有一個城市列表的資料庫檔案,sqlite,名為city.db
將它放在main/assets資料夾下
2)新建一個City類
package com.example.xchen.mweather; /** * Created by xchen on 16/12/19. */ public class City { private String province; private String city; private String number; private String firstPY; private String allPY; private String allFirstPY; public City(String province,String city,String number,String firstPY,String allPY,String allFirstPY) { this.province = province; this.city = city; this.number = number; this.firstPY = firstPY; this.allPY = allPY; this.allFirstPY = allFirstPY; } public String getAllFirstPY() { return allFirstPY; } public void setAllFirstPY(String allFirstPY) { this.allFirstPY = allFirstPY; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public String getFirstPY() { return firstPY; } public void setFirstPY(String firstPY) { this.firstPY = firstPY; } public String getAllPY() { return allPY; } public void setAllPY(String allPY) { this.allPY = allPY; } public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } }
3)自定義一個Application類
新建一個java類,名為MyApplication,繼承自Application
內容:
4)在Manifest中註冊這個applicationpackage com.example.xchen.mweather; import android.app.Application; import android.util.Log; /** * Created by xchen on 16/12/19. */ public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); Log.d("MyApplication","OnCreate"); } }
執行一下!
5)給MyApplication新增getInstance方法
package com.example.xchen.mweather; import android.app.Application; import android.util.Log; /** * Created by xchen on 16/12/19. */ public class MyApplication extends Application { private static Application mApp; @Override public void onCreate() { super.onCreate(); Log.d("MyApplication","OnCreate"); mApp = this; } public static Application getInstance() { return mApp; } }
6)建立CityDB類
使用SQLiteDatabase(android.database.sqlite.SQLiteDatabase)
public class CityDB {
public static final String CITY_DB_NAME = "city.db";
private static final String CITY_TABLE_NAME = "city";
private SQLiteDatabase db;
public CityDB(Context context, String path){
db = context.openOrCreateDatabase(CITY_DB_NAME,Context.MODE_PRIVATE,null);
}
public List<City> getCityList()
{
List<City> list = new ArrayList<>();
Cursor cursor = db.rawQuery("SELECT * from "+CITY_TABLE_NAME,null);
while(cursor.moveToNext())
{
String province = cursor.getString(cursor.getColumnIndex("province"));
String city = cursor.getString(cursor.getColumnIndex("city"));
String number = cursor.getString(cursor.getColumnIndex("number"));
String allPY = cursor.getString(cursor.getColumnIndex("allpy"));
String allFirstPY = cursor.getString(cursor.getColumnIndex("allfirstpy"));
String firstPY = cursor.getString(cursor.getColumnIndex("firstpy"));
City item = new City(province,city,number,allPY,allFirstPY,firstPY);
list.add(item);
}
return list;
}
}
7)修改MyApplication
package com.example.xchen.mweather;
import android.app.Application;
import android.os.Environment;
import android.util.Log;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* Created by xchen on 16/12/19.
*/
public class MyApplication extends Application {
private static Application mApp;
List<City> cityList;
CityDB mCityDB;
@Override
public void onCreate() {
super.onCreate();
Log.d("MyApplication","OnCreate");
mApp = this;
mCityDB = openCityDB();
initCityList();
}
public static Application getInstance()
{
return mApp;
}
public CityDB openCityDB()
{
String path = "/data"
+ Environment.getDataDirectory().getAbsolutePath()
+ File.separator + getPackageName()
// + File.separator + "databases"
+ File.separator + CityDB.CITY_DB_NAME;
Log.d("file path",path);
File db = new File(path);
Log.d("db",path);
try {
InputStream is = getAssets().open("city.db");
FileOutputStream fos = new FileOutputStream(db);
int len = -1;
byte[] buffer = new byte[1024];
while((len = is.read(buffer))!=-1)
{
fos.write(buffer,0,len);
//Log.d("write buffer",buffer.toString());
fos.flush();
}
fos.close();
is.close();
}catch (Exception e)
{
e.printStackTrace();
System.exit(0);
}
return new CityDB(this,path);
}
private boolean prepareCityList()
{
cityList = mCityDB.getCityList();
for(City city:cityList)
{
String cityName = city.getCity();
Log.d("CityDB",cityName);
}
return true;
}
private void initCityList()
{
//CityList = new ArrayList<City>();
new Thread(new Runnable() {
@Override
public void run() {
prepareCityList();
}
}).start();
}
private List<City> getCityList()
{
return cityList;
}
}
執行一下!