標籤:分享 and sql語句 code todo card 資料 else save
在做Android應用的時候,不可避免要用到資料庫。可是當我們把應用的apk部署到真機上的時候,已經建立好的資料庫及其裡邊的資料是不能隨著apk一起安裝到真機上的。
(PS:這篇部落格攻克了我前面部落格中寫的一個小遊戲的一個問題。另外也能夠讀取Raw檔案夾下的資料庫檔案)
這就造成了一個問題。這個問題事實上非常好解決,解決方案例如以下:
我們首先把有資料的資料庫檔案放在assets資源檔夾下邊,然後在apk應用啟動的時候,把assets檔案夾下的資料庫檔案的資料寫入到真機的記憶體中去。
下邊開始我們的代碼編寫:
首先。我們建立一個datab的Android Project命名為datab,我們把project的資料夾檢視貼出來:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDgwMDUzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >
我們首先要建立一個資料庫,能夠在DatabActivity.java中用sql語句建立,然後插入幾條資料。然後把建立好而且插入資料的資料庫放入assets目錄下邊。
我們看下我放入的test.db資料庫的結構:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDgwMDUzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >
能夠看到。在test.db中我們插入了三條資料。
接下來,我們就是要在應用啟動的時候讀取assets檔案夾下的資料庫,然後把test.db寫入SDcard的data/data/com.datab.cn路徑下邊。
我們首先建立一個類:SQLdm.java:
<span style="font-size:18px;">package com.datab.cn;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import android.content.Context;import android.content.res.AssetManager;import android.database.sqlite.SQLiteDatabase;import android.util.Log;/** * 這個類就是實現從assets檔案夾讀取資料庫檔案然後寫入SDcard中,假設在SDcard中存在。就開啟資料庫,不存在就從assets檔案夾下複製過去 * @author Big_Adamapple * */public class SQLdm { //資料庫儲存路徑 String filePath = "data/data/com.datab.cn/test.db"; //資料庫存放的檔案夾 data/data/com.main.jh 以下 String pathStr = "data/data/com.datab.cn"; SQLiteDatabase database; public SQLiteDatabase openDatabase(Context context){ System.out.println("filePath:"+filePath); File jhPath=new File(filePath); //查看資料庫檔案是否存在 if(jhPath.exists()){ Log.i("test", "存在資料庫"); //存在則直接返回開啟的資料庫 return SQLiteDatabase.openOrCreateDatabase(jhPath, null); }else{ //不存在先建立檔案夾 File path=new File(pathStr); Log.i("test", "pathStr="+path); if (path.mkdir()){ Log.i("test", "建立成功"); }else{ Log.i("test", "建立失敗"); }; try { //得到資源 AssetManager am= context.getAssets(); //得到資料庫的輸入資料流 InputStream is=am.open("test.db"); Log.i("test", is+""); //用輸出資料流寫到SDcard上面 FileOutputStream fos=new FileOutputStream(jhPath); Log.i("test", "fos="+fos); Log.i("test", "jhPath="+jhPath); //建立byte數組 用於1KB寫一次 byte[] buffer=new byte[1024]; int count = 0; while((count = is.read(buffer))>0){ Log.i("test", "得到"); fos.write(buffer,0,count); } //最後關閉就能夠了 fos.flush(); fos.close(); is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } //假設沒有這個資料庫 我們已經把他寫到SD卡上了。然後在運行一次這種方法 就能夠返回資料庫了 return openDatabase(context); } } }</span>
然後,我們在DatabActivity.java中獲得資料庫中的資料:
<span style="font-size:18px;">package com.datab.cn;import android.app.Activity;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import android.widget.TextView;public class DatabActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //開啟資料庫輸出資料流 SQLdm s = new SQLdm(); SQLiteDatabase db =s.openDatabase(getApplicationContext()); TextView textv = (TextView) findViewById(R.id.textv); //查詢資料庫中testid=1的資料 Cursor cursor = db.rawQuery("select * from testbiao where testid=?", new String[]{"1"}); String name = null; if(cursor.moveToFirst()){ name = cursor.getString(cursor.getColumnIndex("name")); } //這是一個TextView,把得到的資料庫中的name顯示出來. textv.setText(name); cursor.close(); }}</span>我們的main.xml視圖也貼出來吧,非常easy。一看就懂了。
然後。我們在虛擬機器上看看我們的介面是什麼樣的:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDgwMDUzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >
能夠看到,我們得到了資料庫中的資料了,接下來大家能夠把bin檔案夾下的apk檔案放入到真機中測試,依舊會得到資料庫中的資料
Android開發系列(十七):讀取assets檔案夾下的資料庫檔案