前言
在開發(fā)的過程中檬果,我們有時會遇到這種情況:
你在建立本地數(shù)據(jù)庫的時候需要用到一個db文件中的數(shù)據(jù)兴猩,那么怎么處理呢箫措?
你需要:
- 將db文件復(fù)制到自己的項目中
- 將db文件中的數(shù)據(jù)拷貝到自己的sqlite中(會涉及到自定義數(shù)據(jù)庫路徑的講解)
下面就來具體的講解:
一.將db文件復(fù)制到自己的項目中
db文件一般拷貝到自己項目的 assets 文件夾下垮卓,如果沒有assets文件夾傻工,那么新建的話可以參考我的這篇文章
Android studio 添加assets文件夾
好了挑格,現(xiàn)在在你項目中已經(jīng)有db文件了咙冗,接下來就是拷貝數(shù)據(jù)建自己的數(shù)據(jù)庫了
二. 將db文件中的數(shù)據(jù)拷貝到自己的sqlite中
寫一個DBManager類,代碼如下:
/**
* Instruction:復(fù)制assets文件夾下db文件
*
* Author:pei
* Date: 2017/6/27
* Description:
*/
public class DBManager {
private static final String ASSETS_DB_NAME = "order_form.db";//assets文件夾下數(shù)據(jù)庫文件名
//復(fù)制數(shù)據(jù)庫相關(guān)
private final String CREAGTE_DB_NAME = "user.db";//復(fù)制到手機中的數(shù)據(jù)庫文件名
private final String DB_PATH="/data/data/%s/databases/";//數(shù)據(jù)庫文件夾路徑
private DBManager() {}
private static class DbHolder {
private static DBManager instance = new DBManager();
}
public static DBManager getInstance() {
return DbHolder.instance;
}
/**獲取sqlite數(shù)據(jù)庫對象**/
public SQLiteDatabase getDataBase() {
String packageName=AppUtil.getPackageName();
String dbDirPath=String.format(DB_PATH, packageName);
String dbFilePath=String.format(DB_PATH+CREAGTE_DB_NAME, packageName);
if(FileUtil.isSdcardExist()) {
FileUtil.createDirFile(dbDirPath);//db文件夾不存在則創(chuàng)建
if(!FileUtil.isFileExist(dbFilePath)){//db文件不存在則從assets復(fù)制
try {
FileOutputStream out = new FileOutputStream(dbFilePath);
InputStream in = AppContext.getInstance().getAssets().open(ASSETS_DB_NAME);
byte[] buffer = new byte[1024];
int readBytes = 0;
while ((readBytes = in.read(buffer)) != -1){
out.write(buffer, 0, readBytes);
}
out.flush();
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return SQLiteDatabase.openOrCreateDatabase(dbFilePath, null);
}
/**
* 關(guān)閉sqlite數(shù)據(jù)數(shù)據(jù)庫
*/
public void closeDataBase(){
SQLiteDatabase dataBase= getDataBase();
if(dataBase!=null){
dataBase.close();
}
}
}
下面來看看getDataBase()中的這行代碼:
return SQLiteDatabase.openOrCreateDatabase(dbFilePath, null);
當(dāng) dbFilePath為 CREAGTE_DB_NAME(CREAGTE_DB_NAME = "user.db")時漂彤,即:
SQLiteDatabase.openOrCreateDatabase("user.db", null);
表示數(shù)據(jù)創(chuàng)建為默認(rèn)地址
當(dāng) dbFilePath為自定義路徑雾消,如 dbFilePath="/data/data/op/file/user.db",即:
String dbFilePath="/data/data/op/file/user.db"
SQLiteDatabase.openOrCreateDatabase(dbFilePath, null);
表示數(shù)據(jù)庫創(chuàng)建為自定義地址,這里需要注意的是dbFilePath需要以"/"開頭挫望,若
String dbFilePath="data/data/op/file/user.db"
SQLiteDatabase.openOrCreateDatabase(dbFilePath, null);
運行時是會報錯的
最后立润,當(dāng)然是要添加讀寫權(quán)限了
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
android7.0讀寫權(quán)限也是要添加的,這里就不做講解了
OK,今天的講解就到這里了媳板,謝謝大家桑腮。