package com.xiecc.seeWeather.modules.city.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.os.Environment; import android.support.annotation.Nullable; import com.xiecc.seeWeather.R; import com.xiecc.seeWeather.base.BaseApplication; import com.xiecc.seeWeather.component.PLog; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; /** * Created by hugo on 2015/9/30 0030. * 数据库管理类 */ public class DBManager { private static String TAG = DBManager.class.getSimpleName(); public static final String DB_NAME = "china_city.db"; //数据库名字 public static final String PACKAGE_NAME = "com.xiecc.seeWeather"; public static final String DB_PATH = "/data" + Environment.getDataDirectory().getAbsolutePath() + "/" + PACKAGE_NAME; //在手机里存放数据库的位置(/data/data/com.xiecc.seeWeather/china_city.db) private SQLiteDatabase database; private Context context; private DBManager() { } public static DBManager getInstance() { return DBManagerHolder.sInstance; } private static final class DBManagerHolder { public static final DBManager sInstance = new DBManager(); } public SQLiteDatabase getDatabase() { return database; } public void openDatabase() { //PLog.e(TAG, DB_PATH + "/" + DB_NAME); this.database = this.openDatabase(DB_PATH + "/" + DB_NAME); } @Nullable private SQLiteDatabase openDatabase(String dbfile) { try { if (!(new File(dbfile).exists())) { //判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库 InputStream is = BaseApplication.getAppContext().getResources().openRawResource(R.raw.china_city); //欲导入的数据库 FileOutputStream fos = new FileOutputStream(dbfile); int BUFFER_SIZE = 400000; byte[] buffer = new byte[BUFFER_SIZE]; int count; while ((count = is.read(buffer)) > 0) { fos.write(buffer, 0, count); } fos.close(); is.close(); } return SQLiteDatabase.openOrCreateDatabase(dbfile, null); } catch (FileNotFoundException e) { PLog.e("File not found"); e.printStackTrace(); } catch (IOException e) { PLog.e("IO exception"); e.printStackTrace(); } return null; } public void closeDatabase() { if (this.database != null) { this.database.close(); } } }