项目中经常需要提前预置数据库文件到app中,那么怎么预置和加载最好呢。
我们可以把db文件预置在raw中,读取流然后转存到sd卡上面,然后加载。那么为什么防止raw而不是asset中呢,因为这样我们直接可以通过资源id来获取这个资源的数据了转存十分方便。
//复制raw中的db文件到 data/data下面
public static void copyAndLoadDB(Context context) throws Exception {
File dir = new File("data/data/" + context.getPackageName() + "/databases");
if (!dir.exists() || !dir.isDirectory()) {
if (!dir.mkdir()) {
throw new Exception("创建数据库文件失败!");
}
}
File file = new File(dir, "province_city.db");
if (!file.exists()) {
try {
InputStream is = context.getResources().openRawResource(R.raw.province_city);
OutputStream os = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
os.close();
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
下一步获取data/data数据库实例就可以访问了
/** 获取数据库 操作对象*/
public static SQLiteDatabase getProvinceDB(Context context) {
// SQLiteDatabase database = null;
if (null == database) {
File file = new File("data/data/" + context.getPackageName() + "/databases" + "/province_city.db");
if (file.exists()) {
database = SQLiteDatabase.openOrCreateDatabase(file, null);
}
}
return database;
}