Android開發系列(十七):讀取assets檔案夾下的資料庫檔案

來源:互聯網
上載者:User

標籤:分享   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檔案夾下的資料庫檔案

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.