一讯屈、簡介
??????在開發(fā)中不知道大家有沒有遇到過這樣的需求,把有數(shù)據(jù)的數(shù)據(jù)庫文件放在assets資源目錄下邊,然后在apk應(yīng)用啟動(dòng)的時(shí)候,把a(bǔ)ssets目錄下的數(shù)據(jù)庫文件的數(shù)據(jù)寫入到真機(jī)的本地文件中去拦惋。
存放在該目錄下的文件的特點(diǎn):
1.assets里面存放的都是原生文件,不會(huì)對里面的文件轉(zhuǎn)碼
2.該目錄下的文件只支持讀取安寺,即只能獲取輸入流
3.不在R文件注冊
4.可以建文件夾
5.一般存放網(wǎng)頁厕妖,圖片,音樂挑庶,數(shù)據(jù)庫言秸,文本文件等:
備注:
拷貝數(shù)據(jù)庫的最佳時(shí)間:項(xiàng)目初始化的時(shí)候,一般就是在展示公司Logo,的時(shí)候開始拷貝迎捺。并且举畸,控制好只拷貝一次。
二凳枝、實(shí)現(xiàn)步驟(只需2步哦)
1抄沮、Android Studio新建項(xiàng)目,把項(xiàng)目切換到project視圖岖瑰,在與java同級的目錄下叛买,新建一個(gè)assets文件,不多說蹋订,來張圖
接下來把數(shù)據(jù)庫文件復(fù)制到assets目錄下
2率挣、讀取assets目錄下的數(shù)據(jù)庫,然后把test.db文件拷貝到SDcard的data/datacom.zx.copydatabase路徑下露戒,具體實(shí)現(xiàn)如下:
/**
* 將assets下的資源復(fù)制到應(yīng)用程序的databases目錄下
* @param context 上下文
* @param fileName assets下的資源的文件名
*/
public static void copyAssetsToDB(Context context, String fileName) throws IOException {
//數(shù)據(jù)庫的存儲路徑,該路徑在:data/data/包名/databases目錄下椒功,
String destPath = context.getDatabasePath("").getPath();
Log.i("tag","path---->"+destPath);
File file = new File(destPath);
if (!file.exists()) {
file.mkdirs(); //創(chuàng)建目錄
}else {
return;
}
//打開assest文件,獲得輸入流
InputStream is = context.getAssets().open(fileName);
BufferedInputStream bis = new BufferedInputStream(is);
//獲得寫入文件的輸出流
FileOutputStream fos = new FileOutputStream(destPath +File.separator + fileName);
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] data = new byte[2 * 1024];
int len;
while ((len = bis.read(data)) != -1){
bos.write(data, 0, len);
}
bos.flush();
bis.close();
bos.close();
}
----------------至此拷貝數(shù)據(jù)庫文件到真機(jī)本地已經(jīng)完成-----------------------------
三智什、讀取拷貝后的數(shù)據(jù)庫中的數(shù)據(jù):
/**
* 獲得sqlite數(shù)據(jù)庫對象
* @param dbPath 數(shù)據(jù)庫中對應(yīng)表的完整路徑
*/
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(dbPath, null);
有了這個(gè)對象动漾,你就可以根據(jù)你的項(xiàng)目需求進(jìn)行查詢數(shù)據(jù)庫的操作了吧