1. 程式人生 > >Android上實現一個簡單的天氣預報APP(八) 從資料庫讀取城市資料

Android上實現一個簡單的天氣預報APP(八) 從資料庫讀取城市資料

學習參考資源: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

內容:

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 {
    @Override
    public void onCreate() {
        super.onCreate();

        Log.d("MyApplication","OnCreate");
    }
}
4)在Manifest中註冊這個application

執行一下!


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;
    }

}


執行一下!