package com.xiaomi.xms.sales.db; import android.content.ContentValues; import android.content.Context; import android.content.res.Resources.NotFoundException; import android.database.sqlite.SQLiteDatabase; import android.text.TextUtils; import com.xiaomi.xms.sales.R; import com.xiaomi.xms.sales.db.DBContract.DataMimeType; import com.xiaomi.xms.sales.db.DBContract.DataStats; import com.xiaomi.xms.sales.db.DBContract.Region; import com.xiaomi.xms.sales.db.DatabaseHelper.Tables; import com.xiaomi.xms.sales.util.LogUtil; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class RegionDBHelper { private static final String TAG = "RegionDBHelper"; private static final String CONTENTS_SEP = "\t"; private static final String CONFIG_SEP = ":"; public final class HEADER { public static final String VERSION = "VERSION"; } private static RegionDBHelper mInstance = null; private Context mContext; public static synchronized RegionDBHelper getInstance(Context context) { if (mInstance == null) { mInstance = new RegionDBHelper(context); } return mInstance; } private RegionDBHelper(Context context) { mContext = context; } private Map<String, String> readConfig(BufferedReader br) throws IOException { Map<String, String> map = new HashMap<String, String>(); String line; while (null != (line = br.readLine())) { if (TextUtils.equals(line, "")) { break; } String[] fields = line.split(CONFIG_SEP); if (fields.length != 2) { continue; } map.put(fields[0], fields[1]); } return map; } private ArrayList<ContentValues> readContents(BufferedReader br) throws IOException { ArrayList<ContentValues> contents = new ArrayList<ContentValues>(); String line; while (null != (line = br.readLine())) { String[] fields = line.split(CONTENTS_SEP); if (fields.length != 5) { continue; } ContentValues content = new ContentValues(); content.put(Region.TYPE, fields[3]); content.put(Region.PARENT, fields[1]); content.put(Region._ID, fields[0]); content.put(Region.NAME, fields[2]); content.put(Region.ZIPCODE, fields[4]); contents.add(content); } return contents; } public RegionInfo readFromResource() { RegionInfo region = new RegionInfo(); BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(mContext.getResources() .openRawResource(R.raw.region), "UTF8")); region.configs = readConfig(br); region.contents = readContents(br); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } catch (NotFoundException e) { e.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } finally { if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } return region; } public boolean initialDB(SQLiteDatabase db) { LogUtil.d(TAG, "init region db."); RegionInfo regions = readFromResource(); for (ContentValues content : regions.contents) { db.insert(Tables.REGION, null, content); } // update etag database ContentValues first = new ContentValues(); first.put(DataStats.TYPE, DataMimeType.REGION); first.put(DataStats.STATS, regions.configs.get(HEADER.VERSION)); db.insert(Tables.DATASTATS, null, first); return true; } public class RegionInfo { public ArrayList<ContentValues> contents = null; public Map<String, String> configs = null; } public boolean updateRegionDB(RegionInfo regions) { SQLiteDatabase db = DatabaseHelper.getInstance(mContext).getWritableDatabase(); mContext.getContentResolver().delete(Region.CONTENT_URI, null, null); db.beginTransaction(); for (ContentValues content : regions.contents) { db.insert(Tables.REGION, null, content); } db.setTransactionSuccessful(); db.endTransaction(); // update etag database ContentValues first = new ContentValues(); first.put(DataStats.TYPE, DataMimeType.REGION); first.put(DataStats.STATS, regions.configs.get(HEADER.VERSION)); db.update(Tables.DATASTATS, first, DataStats.TYPE + "='" + DataMimeType.REGION + "'", null); return true; } }