移动应用开发实践-Task7-城市列表导入数据库

移动应用开发实践-Task7-城市列表导入数据库

目的

使用数据库导入浏览到的在线城市列表,实现离线浏览

1.编写 CityDatabase

主要实现数据库初始化(建表)、打开数据库、结束数据库、导入对象、导入对象列表、重置数据库、通过游标获取对象列表、通过sql语句获取对象列表、查询所有省份等。

package com.example.fyn_weather_task8_0.db;

import ...

public class CityDatabase {
    public static final String KEY_ID = "mid";//main id for url
    public static final String KEY_PID = "pid";// parent id
    public static final String KEY_NAME = "name";
    public static final String KEY_WEATHER_ID = "weather_id";
    public static final String KEY_EN_NAME = "en_name";
    public static final String KEY_INI_NAME = "ini_name";
    public static final String KEY_LEVEL = "level";
    public static final String KEY_LOOK_UP = "key_look_up";
    private static final String DB_NAME = "citydb.db";
    public static final String CITY_TABLE = "city";
    private int version = 1;

    private Activity activity;
    private SQLiteDatabase db;
    private DatabaseHelper databaseHelper;

    public CityDatabase(Activity activity) {
        this.activity = activity;
    }

    public void open() {// open database by DatabaseHelper
        if (db == null || !db.isOpen()) {
            databaseHelper = new DatabaseHelper();
            db = databaseHelper.getWritableDatabase();
        }
    }

    public void close() {// close the database
        if (db != null && db.isOpen()) {
            db.close();
        }
    }

    private ContentValues enCodeCotentValues(City city) {// parse the city to ContentValues
        ContentValues cv = new ContentValues();
        cv.put(KEY_EN_NAME, city.getEnName());
        cv.put(KEY_ID, city.getId());
        cv.put(KEY_INI_NAME, city.getInitialName());
        cv.put(KEY_LEVEL, city.getLevel());
        cv.put(KEY_LOOK_UP, generateLookup(city));
        cv.put(KEY_PID, city.getParentId());
        cv.put(KEY_WEATHER_ID, city.getWeather_id());
        cv.put(KEY_NAME, city.getName());
        return cv;
    }

    private City getCityFromCursor(Cursor c) {
        // parse the Cursor c to City by present position
        // ctr+d copy current row
        String name = c.getString(c.getColumnIndex(KEY_NAME));
        String enName = c.getString(c.getColumnIndex(KEY_EN_NAME));
        String iniName = c.getString(c.getColumnIndex(KEY_INI_NAME));
        String weather_id = c.getString(c.getColumnIndex(KEY_WEATHER_ID));
        int id = c.getInt(c.getColumnIndex(KEY_ID));
        int pid = c.getInt(c.getColumnIndex(KEY_PID));
        int level = c.getInt(c.getColumnIndex(KEY_LEVEL));
        City city = new City(id, name, pid);
        city.setEnName(enName);
        city.setInitialName(iniName);
        city.setLevel(level);
        city.setWeather_id(weather_id);
        return city;
    }

    public long insertData(City city) { // insert city to the database
        ContentValues cv = enCodeCotentValues(city);
        return db.insert(CITY_TABLE, KEY_WEATHER_ID, cv);

    }


    public int insertList(List<City> list) {// insert the whole list to the database
        int count = 0;
        if (list != null && list.size() > 0) {
            for (int i = 0; i < list.size(); i++) {
                City city = list.get(i);
                if (insertData(city) > 0) {
                    count++;
                }
            }
        }
        return count;
    }

    public void clearDatabase() {//clear the data
        databaseHelper.resetData(db);
    }

    public List<City> getCityListFromCursor(Cursor c) {// change the cursor to a City list
        List<City> list = new ArrayList<>();
        if (c != null && c.getCount() > 0) {
            for (int i = 0; i < c.getCount(); i++) {
                c.moveToPosition(i);
                City city = getCityFromCursor(c);
                list.add(city);
            }
        }
        return list;

    }

    private List<City> getCityListBySql(String sql, String[] args) {// get list by sql and args
        Cursor cursor = db.rawQuery(sql, args);
        List<City> list = getCityListFromCursor(cursor);
        cursor.close();
        return list;
    }

    public List<City> queryAllProvinces() {// get the root data
        String sql = String.format("select * from %s where %s=0", CITY_TABLE, KEY_LEVEL);
        List<City> list = getCityListBySql(sql, null);
        return list;

    }

    public List<City> queryCityListByParentId(int parentId, int level) {
        String sql = String.format("select * from %s where %s=%d and %s=%d", CITY_TABLE, KEY_PID, parentId, KEY_LEVEL, level);
        List<City> list = getCityListBySql(sql, null);
        return list;
    }

    class DatabaseHelper extends SQLiteOpenHelper {
        public DatabaseHelper() {
            super(activity, DB_NAME, null, version);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            String sql = String.format("create table if not exists %s" +
                            "(_id INTEGER PRIMARY KEY AUTOINCREMENT,%s int,%s int,%s text,%s text,%s text,%s int,%s text,%s text)",
                    CITY_TABLE, KEY_ID, KEY_PID, KEY_NAME, KEY_EN_NAME, KEY_INI_NAME, KEY_LEVEL, KEY_LOOK_UP, KEY_WEATHER_ID);
            db.execSQL(sql);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            resetData(db);
        }

        public void resetData(SQLiteDatabase db) {
            String sql = String.format("drop table if exists %s", CITY_TABLE);
            db.execSQL(sql);
            onCreate(db);
        }
    }
}

2.MainActivity改写

package com.example.fyn_weather_task8_0;

import ...

public class MainActivity extends AppCompatActivity {

...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        cityDatabase = new CityDatabase(MainActivity.this);
        cityDatabase.open();
        ...
    }


    private void getAndUpdateCityList(final String url, final int parent_id, final int level) {
        List<City> list = cityDatabase.queryCityListByParentId(parent_id, level);

        if (list == null || list.size() == 0) {

            HttpUtil.getOkHttpAsync(MainActivity.this, url, new HttpUtil.SimpleAsyncCall() {
                @Override
                public void onFailure(String e) {
                    showToast(e);
                }

                @Override
                public void onResponse(String s) {
                    textView.setText(url);
                    List<City> list = JsonUtil.getCityListFromJson(s, parent_id, level);
                    cityDatabase.insertList(list);
                    showDbList(parent_id, level);
                    //updateListView(list);
                }
            });
        } else {
            textView.setText(url);
            updateListView(list);
        }


    }

    private void showDbList(int parent_id, int level) {
        List<City> list = cityDatabase.queryCityListByParentId(parent_id, level);
        updateListView(list);
    }

    private void updateListView(List<City> list) {
        ...
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        cityDatabase.close();
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值