1. 程式人生 > >Android SQLite的資料庫檔案儲存在SD卡中(一)

Android SQLite的資料庫檔案儲存在SD卡中(一)

  SQLite的特性:

      •輕量級
      使用 SQLite 只需要帶一個動態庫,就可以享受它的全部功能,而且那個動態庫的尺寸想當小。
      •獨立性
      SQLite 資料庫的核心引擎不需要依賴第三方軟體,也不需要所謂的“安裝”。
      •隔離性
      SQLite 資料庫中所有的資訊(比如表、檢視、觸發器等)都包含在一個資料夾內,方便管理和維護。
      •跨平臺
      SQLite 目前支援大部分作業系統,不至電腦作業系統更在眾多的手機系統也是能夠執行,比如:Android。
      •多語言介面
      SQLite 資料庫支援多語言程式設計介面。

      •安全性
      SQLite 資料庫通過資料庫級上的獨佔性和共享鎖來實現獨立事務處理。這意味著多個程序可以在同一時間從同一資料庫讀取資料,但只能有一個可以寫入資料.

       優點:
      1.能儲存較多的資料。
      2.能將資料庫檔案存放到SD卡中!

       什麼是 SQLiteDatabase? 
       一個 SQLiteDatabase 的例項代表了一個SQLite 的資料庫,通過SQLiteDatabase 例項的一些方法,我們可以執行SQL 語句,對資料庫進行增、刪、查、改的操作。需要注意的是,資料庫對於一個應用來說是私有的,並且在一個應用當中,資料庫的名字也是惟一的。


       什麼是 SQLiteOpenHelper ?
       根據這名字,我們可以看出這個類是一個輔助類。這個類主要生成一個數據庫,並對資料庫的版本進行管理。當在程式當中呼叫這個類的方法getWritableDatabase(),或者getReadableDatabase()方法的時候,如果當時沒有資料,那麼Android 系統就會自動生成一個數 據庫。SQLiteOpenHelper 是一個抽象類,我們通常需要繼承它,並且實現裡邊的3 個函式,

        什麼是 ContentValues 類?
        ContentValues 類和Hashmap/Hashtable 比較類似,它也是負責儲存一些名值對,但是它儲存的名值對當中的名是一個String 型別,而值都是基本型別。


        什麼是 Cursor ?
        Cursor 在Android 當中是一個非常有用的介面,通過Cursor 我們可以對從資料庫查詢出來的結果集進行隨機的讀寫訪問。

        xml中定義了我們需要練習用到的幾個操作按鈕,這裡不多解釋了,下面看java原始碼:先看我們繼承的 SQLiteOpenHelper 類

java程式碼:
  1. package com.demo;
  2. import android.content.Context;
  3. import android.database.sqlite.SQLiteDatabase;
  4. import android.database.sqlite.SQLiteOpenHelper;
  5. import android.util.Log;
  6. /**

  7. * @author Himi
  8. * @解釋 此類我們只需要傳建一個建構函式 以及重寫兩個方法就OK啦、

  9. */
  10. public class MySQLiteOpenHelper extends SQLiteOpenHelper {
  11. public final static int VERSION = 1;// 版本號
  12. public final static String TABLE_NAME = "himi";// 表名
  13. public final static String ID = "id";// 後面ContentProvider使用
  14. public final static String TEXT = "text";
  15. public static final String DATABASE_NAME = "Himi.db";
  16. public MySQLiteOpenHelper(Context context) {
  17.   // 在Android 中建立和開啟一個數據庫都可以使用openOrCreateDatabase 方法來實現,
  18.   // 因為它會自動去檢測是否存在這個資料庫,如果存在則開啟,不過不存在則建立一個數據庫;
  19.   // 建立成功則返回一個 SQLiteDatabase物件,否則丟擲異常FileNotFoundException。
  20.   // 下面是來建立一個名為"DATABASE_NAME"的資料庫,並返回一個SQLiteDatabase物件 
  21.   super(context, DATABASE_NAME, null, VERSION); 

  22. @Override
  23. // 在資料庫第一次生成的時候會呼叫這個方法,一般我們在這個方法裡邊生成資料庫表;
  24. public void onCreate(SQLiteDatabase db) { 
  25.   String str_sql = "CREATE TABLE " + TABLE_NAME + "(" + ID
  26.     + " INTEGER PRIMARY KEY AUTOINCREMENT," + TEXT + " text );";
  27.   // CREATE TABLE 建立一張表 然後後面是我們的表名
  28.   // 然後表的列,第一個是id 方便操作資料,int型別
  29.   // PRIMARY KEY 是指主鍵 這是一個int型,用於唯一的標識一行;
  30.   // AUTOINCREMENT 表示資料庫會為每條記錄的key加一,確保記錄的唯一性;
  31.   // 最後我加入一列文字 String型別
  32.   // ----------注意:這裡str_sql是sql語句,類似dos命令,要注意空格!
  33.   db.execSQL(str_sql);
  34.   // execSQL()方法是執行一句sql語句
  35.   // 雖然此句我們生成了一張資料庫表和包含該表的sql.himi檔案,
  36.   // 但是要注意 不是方法是建立,是傳入的一句str_sql這句sql語句表示建立!!
  37. }
  38. @Override
  39. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  40.   // 一般預設情況下,當我們插入 資料庫就立即更新
  41.   // 當資料庫需要升級的時候,Android 系統會主動的呼叫這個方法。
  42.   // 一般我們在這個方法裡邊刪除資料表,並建立新的資料表,
  43.   // 當然是否還需要做其他的操作,完全取決於遊戲需求。
  44.   Log.v("Himi", "onUpgrade");

  45. }
複製程式碼 下面看最重要的MainActivity中的程式碼:

java程式碼:
  1. package com.demo;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import android.app.Activity;
  5. import android.content.ContentValues;
  6. import android.database.Cursor;
  7. import android.database.sqlite.SQLiteDatabase;
  8. import android.os.Bundle;
  9. import android.view.View;
  10. import android.view.Window;
  11. import android.view.WindowManager;
  12. import android.view.View.OnClickListener;
  13. import android.widget.Button;
  14. import android.widget.TextView;
  15. // ------------第三種儲存方式--------《SQLite》---------
  16. /**
  17. * @author Himi
  18. * @儲存方式:SQLite 輕量級資料庫、
  19. * @優點: 可以將自己的資料儲存到檔案系統或者資料庫當中, 也可以將自己的資料存
  20. *         儲到SQLite資料庫當中,還可以存到SD卡中
  21. * @注意1:資料庫對於一個遊戲(一個應用)來說是私有的,並且在一個遊戲當中, 
  22. *         資料庫的名字也是唯一的。
  23. * @注意2 apk中建立的資料庫外部的程序是沒有許可權去讀/寫的, 
  24. *         我們需要把資料庫檔案建立到sdcard上可以解決類似問題.
  25. * @注意3 當你刪除id靠前的資料或者全部刪除資料的時候,SQLite不會自動排序,
  26. *        也就是說再新增資料的時候你不指定id那麼SQLite預設還是在原有id最後新增一條新資料
  27. * @注意4 android 中 的SQLite 語法區分大小寫的!!!!!這點要注意!
  28. *   String UPDATA_DATA = "UPDATE himi SET text='通過SQL語句來修改資料'  WHERE id=1"; 
  29. *                  千萬 不能可以寫成
  30. *   String UPDATA_DATA = "updata himi set text='通過SQL語句來修改資料'  where id=1";
  31. */
  32. public class MainActivity extends Activity implements OnClickListener {
  33. private Button btn_addOne, btn_deleteone, btn_check, btn_deleteTable,
  34.    btn_edit, btn_newTable;
  35. private TextView tv;
  36. private MySQLiteOpenHelper myOpenHelper;// 建立一個繼承SQLiteOpenHelper類例項
  37. private SQLiteDatabase mysql ; 
  38. //---------------以下兩個成員變數是針對在SD卡中儲存資料庫檔案使用
  39. // private File path = new File("/sdcard/himi");// 建立目錄
  40. // private File f = new File("/sdcard/himi/himi.db");// 建立檔案
  41. @Override
  42. public void onCreate(Bundle savedInstanceState) {
  43.   super.onCreate(savedInstanceState);
  44.   getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  45.     WindowManager.LayoutParams.FLAG_FULLSCREEN);
  46.   this.requestWindowFeature(Window.FEATURE_NO_TITLE);
  47.   setContentView(R.layout.main);
  48.   tv = (TextView) findViewById(R.id.tv_title);
  49.   btn_addOne = (Button) findViewById(R.id.sql_addOne);
  50.   btn_check = (Button) findViewById(R.id.sql_check);
  51.   btn_deleteone = (Button) findViewById(R.id.sql_deleteOne);
  52.   btn_deleteTable = (Button) findViewById(R.id.sql_deleteTable);
  53.   btn_newTable = (Button) findViewById(R.id.sql_newTable);
  54.   btn_edit = (Button) findViewById(R.id.sql_edit);
  55.   btn_edit.setOnClickListener(this);
  56.   btn_addOne.setOnClickListener(this);
  57.   btn_check.setOnClickListener(this);
  58.   btn_deleteone.setOnClickListener(this);
  59.   btn_deleteTable.setOnClickListener(this);
  60.   btn_newTable.setOnClickListener(this);
  61.   myOpenHelper = new MySQLiteOpenHelper(this);// 例項一個數據庫輔助器
  62. //備註1  ----如果你使用的是將資料庫的檔案建立在SD卡中,那麼建立資料庫mysql如下操作:
  63. //  if (!path.exists()) {// 目錄存在返回false
  64. //   path.mkdirs();// 建立一個目錄
  65. //  }
  66. //  if (!f.exists()) {// 檔案存在返回false
  67. //   try {
  68. //    f.createNewFile();//建立檔案 
  69. //   } catch (IOException e) {
  70. //    // TODO Auto-generated catch block
  71. //    e.printStackTrace();
  72. //   }
  73. //  } 
  74. }
  75. @Override
  76. public void onClick(View v) {  
  77.   try { 
  78. //備註2----如果你使用的是將資料庫的檔案建立在SD卡中,那麼建立資料庫mysql如下操作:
  79. //       mysql = SQLiteDatabase.openOrCreateDatabase(f, null); 
  80. //備註3--- 如果想把資料庫檔案預設放在系統中,那麼建立資料庫mysql如下操作:
  81.     mysql = myOpenHelper.getWritableDatabase(); // 例項資料庫
  82.    if (v == btn_addOne) {// 新增資料
  83.     // ---------------------- 讀寫控制代碼來插入---------
  84.     // ContentValues 其實就是一個雜湊表HashMap, key值是欄位名稱,
  85.     //Value值是欄位的值。然後 通過 ContentValues 的 put 方法就可以
  86.     //把資料放到ContentValues中,然後插入到表中去!
  87.     ContentValues cv = new ContentValues();
  88.     cv.put(MySQLiteOpenHelper.TEXT, "測試新的資料");
  89.     mysql.insert(MySQLiteOpenHelper.TABLE_NAME, null, cv);
  90.     // inser() 第一個引數 標識需要插入操作的表名
  91.     // 第二個引數 :預設傳null即可
  92.     // 第三個是插入的資料
  93.     // ---------------------- SQL語句插入--------------
  94.     // String INSERT_DATA =
  95.     // "INSERT INTO himi (id,text) values (1, '通過SQL語句插入')";
  96.     // db.execSQL(INSERT_DATA);
  97.     tv.setText("新增資料成功!點選檢視資料庫查詢");
  98.    } else if (v == btn_deleteone) {// 刪除資料
  99.     // ---------------------- 讀寫控制代碼來刪除
  100.     mysql.delete("himi", MySQLiteOpenHelper.ID + "=1", null);
  101.     // 第一個引數 需要操作的表名
  102.     // 第二個引數為 id+操作的下標 如果這裡我們傳入null,表示全部刪除
  103.     // 第三個引數預設傳null即可
  104.     // ----------------------- SQL語句來刪除
  105.     // String DELETE_DATA = "DELETE FROM himi WHERE id=1";
  106.     // db.execSQL(DELETE_DATA);
  107.     tv.setText("刪除資料成功!點選檢視資料庫查詢");
  108.    } else if (v == btn_check) {// 遍歷資料
  109. //備註4------
  110.     Cursor cur = mysql.rawQuery("SELECT * FROM "
  111.       + MySQLiteOpenHelper.TABLE_NAME, null);
  112.     if (cur != null) {
  113.      String temp = "";
  114.      int i = 0;
  115.      while (cur.moveToNext()) {//直到返回false說明表中到了資料末尾
  116.       temp += cur.getString(0); 
  117.       // 引數0 指的是列的下標,這裡的0指的是id列
  118.       temp += cur.getString(1);
  119.       // 這裡的0相對於當前應該是咱們的text列了
  120.       i++;
  121.       temp += "  "; // 這裡是我整理顯示格式 ,呵呵~
  122.       if (i % 3 == 0) // 這裡是我整理顯示格式 ,呵呵~
  123.        temp += "\n";// 這裡是我整理顯示格式 ,呵呵~
  124.      }
  125.      tv.setText(temp);
  126.     }
  127.    } else if (v == btn_edit) {// 修改資料
  128.     // ------------------------控制代碼方式來修改 -------------
  129.     ContentValues cv = new ContentValues();
  130.     cv.put(MySQLiteOpenHelper.TEXT, "修改後的資料");
  131.     mysql.update("himi", cv, "id " + "=" + Integer.toString(3), null);
  132.     // ------------------------SQL語句來修改 -------------
  133.     // String UPDATA_DATA =
  134.     // "UPDATE himi SET text='通過SQL語句來修改資料'  WHERE id=1";
  135.     // db.execSQL(UPDATA_DATA);
  136.     tv.setText("修改資料成功!點選檢視資料庫查詢");
  137.    } else if (v == btn_deleteTable) {// 刪除表
  138.     mysql.execSQL("DROP TABLE himi");
  139.     tv.setText("刪除表成功!點選檢視資料庫查詢");
  140.    } else if (v == btn_newTable) {// 新建表
  141.     String TABLE_NAME = "himi";
  142.     String ID = "id";
  143.     String TEXT = "text";
  144.     String str_sql2 = "CREATE TABLE " + TABLE_NAME + "(" + ID
  145.       + " INTEGER PRIMARY KEY AUTOINCREMENT," + TEXT
  146.       + " text );";
  147.     mysql.execSQL(str_sql2);
  148.     tv.setText("新建表成功!點選檢視資料庫查詢");
  149.    }
  150.    // 刪除資料庫:
  151.    // this.deleteDatabase("himi.db");
  152.   } catch (Exception e) {
  153.    tv.setText("操作失敗!");
  154.   } finally {// 如果try中異常,也要對資料庫進行關閉
  155.    mysql.close();
  156.   }
  157. }
  158. }
複製程式碼