package com.silencedut.knowweather.repository.db;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.github.promeg.pinyinhelper.Pinyin;
import com.silencedut.knowweather.WeatherApplication;
import com.silencedut.knowweather.citys.adapter.CityInfoData;
import com.silencedut.knowweather.utils.FileUtil;
import com.silencedut.knowweather.repository.PreferencesUtil;
import com.silencedut.knowweather.scheduler.TaskScheduler;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* Created by SilenceDut on 16/10/28.
*/
public class DBManage {
private static DBManage sDBManage;
private static DBHelper sDBHelper;
private static final String CITY_INITED = "CITY_INITED";
private DBManage() {
}
public static DBManage getInstance() {
if (sDBManage == null) {
synchronized (DBHelper.class) {
if (sDBManage == null) {
sDBManage = new DBManage();
sDBHelper = DBHelper.getInstance(WeatherApplication.getContext());
}
}
}
return sDBManage;
}
public void copyCitysToDB() {
boolean cityInited = PreferencesUtil.get(CITY_INITED, false);
if (cityInited) {
return;
}
TaskScheduler.runOnBackgroundThread(new Runnable() {
@Override
public void run() {
String citys = FileUtil.assetFile2String("cityList.txt", WeatherApplication.getContext());
CityEntry cityEntry = WeatherApplication.getGson().fromJson(citys, CityEntry.class);
Collections.sort(cityEntry.getCity_info(), new CityComparator());
// Gets the data repository in write mode
SQLiteDatabase db = sDBHelper.getWritableDatabase();
db.beginTransaction();
try {
ContentValues values;
for (CityEntry.CityInfoEntity cityInfoEntity : cityEntry.getCity_info()) {
// Create a new map of values, where column names are the keys
StringBuilder stringBuilder = new StringBuilder();
StringBuilder initials = new StringBuilder();
for (char hanzi : cityInfoEntity.getCity().toCharArray()) {
String pinyin = Pinyin.toPinyin(hanzi);
stringBuilder.append(pinyin);
initials.append(pinyin.charAt(0));
}
stringBuilder.append(initials);
values = new ContentValues();
values.put(CityDao.CITY_NAME, cityInfoEntity.getCity());
values.put(CityDao.PINYIN, stringBuilder.toString());
values.put(CityDao.CITY_ID, cityInfoEntity.getId().substring(2, cityInfoEntity.getId().length()));
db.insert(CityDao.TABLE_NAME, null, values);
}
db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚不提交。
PreferencesUtil.put(CITY_INITED, true);
} catch (Exception e) {
e.getMessage();
} finally {
db.endTransaction(); //处理完成
}
}
});
}
/**
* 读取所有城市
*
* @return
*/
public List<CityInfoData> getAllCities() {
String allCitySql = "select * from " + CityDao.TABLE_NAME;
return getCitys(allCitySql, true);
}
/**
* 通过名字或者拼音搜索
*
* @param keyword
* @return
*/
public List<CityInfoData> searchCity(final String keyword) {
String searchSql = "select * from " + CityDao.TABLE_NAME + " where " + CityDao.CITY_NAME + " like \"%" + keyword + "%\" or " + CityDao.PINYIN + " like \"%" + keyword + "%\" or " + CityDao.CITY_ID + " like \"%" + keyword + "%\"";
return getCitys(searchSql, false);
}
private List<CityInfoData> getCitys(String sql, boolean all) {
SQLiteDatabase db = sDBHelper.getReadableDatabase();
Cursor cursor = db.rawQuery(sql, null);
List<CityInfoData> result = new ArrayList<>();
CityInfoData city;
String lastInitial = "";
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex(CityDao.CITY_NAME));
String pinyin = cursor.getString(cursor.getColumnIndex(CityDao.PINYIN));
String cityId = cursor.getString(cursor.getColumnIndex(CityDao.CITY_ID));
city = new CityInfoData(name, pinyin, cityId);
String currentInitial = pinyin.substring(0, 1);
if (!lastInitial.equals(currentInitial) && all) {
city.setInitial(currentInitial);
lastInitial = currentInitial;
}
result.add(city);
}
cursor.close();
db.close();
return result;
}
/**
* a-z排序
*/
private class CityComparator implements Comparator<CityEntry.CityInfoEntity> {
@Override
public int compare(CityEntry.CityInfoEntity lhs, CityEntry.CityInfoEntity rhs) {
char a = Pinyin.toPinyin(lhs.getCity().charAt(0)).charAt(0);
char b = Pinyin.toPinyin(rhs.getCity().charAt(0)).charAt(0);
;
return a - b;
}
}
}