2012-06-12

Android 手機資料庫(一) - SQLite 基本介紹、創建及查詢

開發手機應用程式的人都應該要知道的SQLite

資料庫是程式設計中一種不可或缺的夥伴

我剛開始學寫Android時也是本想打死看能不能不要需要資料庫

結果當然是"不可能"XD,該面對的還是要面對-.-

所以就開始研究起SQLite,後來覺得它一點也不難

總結一下研究後的感想:

1.沒有像MS-SQL有專屬操作介面可以看(網上有其他軟體可以找來用)

2.開發Android時不需要安裝,直接叫用就可以了

3.都是以單一檔案的方式存在,一支應用程式對應一個db檔

4.db存放路徑在:/data/data//databases/DB名稱.db

5.支援大多數的SQL指令

6.最大支援到2T bytes

以上是我研究後的心得,感覺上不是很難,只是沒介面使用上有點難而已

不過應該也還好。

基本介紹完了,下面我們來實作看看怎麼使用SQLite在Android應用程式內

創建資料庫:
必須先建立一個SQLiteOpenHelper的class類別

package jim.memorandum;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;

public class NewListDataSQL extends SQLiteOpenHelper {

         //資料庫版本關係到App更新時,資料庫是否要調用onUpgrade()
  private static final int VERSION = 1;//資料庫版本  
  
                //建構子
  public NewListDataSQL(Context context, String name, CursorFactory factory,int version) {
   super(context, name, factory, version);
  }

  public NewListDataSQL(Context context,String name) { 
   this(context, name, null, VERSION); 
   } 
  
   public NewListDataSQL(Context context, String name, int version) {  
    this(context, name, null, version);  
      }  
   
  //輔助類建立時運行該方法
  @Override
  public void onCreate(SQLiteDatabase db) {
   String DATABASE_CREATE_TABLE =
     "create table newMemorandum("
       + "_ID INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL,"
             + "date VARCHAR,"
             + "note VARCHAR,"
             + "pw VARCHAR,"
             + "reminder INT,"
             + "type VARCHAR,"
             + "memo VARCHAR"
         + ")";
            db.execSQL(DATABASE_CREATE_TABLE);
  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   //oldVersion=舊的資料庫版本;newVersion=新的資料庫版本
   db.execSQL("DROP TABLE IF EXISTS newMemorandum"); //刪除舊有的資料表
   onCreate(db);
  }
  
  @Override    
   public void onOpen(SQLiteDatabase db) {     
           super.onOpen(db);       
           // TODO 每次成功打開數據庫後首先被執行     
       } 

   @Override
        public synchronized void close() {
            super.close();
        }

}

當你在activity中調用建構子NewListDataSQL時,程式自己會去判斷databases資料夾中是否有此db檔,如果沒有就會調用onCreate()建立此SQLite資料庫,所以要建立的Table就寫在onCreate()裡面,寫法跟一般SQL的寫法是一樣的。

Activity中呼叫資料庫

package jim.memorandum;
//import進兩個database需要用到的
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;


public class MemorandumActivity extends Activity {
               //SQLiteDatabase對象
          SQLiteDatabase db;
  //資料庫名
  public String db_name = "MemorandumSQL";
  
  //表名
  public String table_name = "newMemorandum";

  //輔助類名
  NewListDataSQL helper = new NewListDataSQL(MemorandumActivity.this, db_name);



                @Override
                public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
        
                //以輔助類獲得資料庫對象
    db = helper.getReadableDatabase();

注意:一個應用程式只允許對應一個db檔,所以資料庫名稱新增後就不能修改,不然程式會自動創立另一個db檔。

資料庫查詢指令

 
        //取得備忘資料
   public String[] myNote(){
    
    Cursor cursor = db.rawQuery("select note from newMemorandum ORDER BY _ID DESC", null);
    //用陣列存資料
    String[] sNote = new String[cursor.getCount()];
    
    int rows_num = cursor.getCount();//取得資料表列數
    if(rows_num != 0) {
     cursor.moveToFirst();   //將指標移至第一筆資料
     for(int i=0; i<rows_num; i++) {
      String strCr = cursor.getString(0);
      sNote[i]=strCr;
      
      cursor.moveToNext();//將指標移至下一筆資料
     }
    }
    cursor.close(); //關閉Cursor
    //dbHelper.close();//關閉資料庫,釋放記憶體,還需使用時不要關閉
    

    return sNote;
   }

我是寫個function去資料庫中查詢資料,"_ID"是PRIMARY KEY

基本上SQLite資料庫應用的建立及查詢就是這樣而已,還蠻簡單的,後面再介紹新增、修改、刪除的資料庫操作。




複製請註明出處,Android 手機資料庫(一) - SQLite  基本介紹、創建及查詢,謝謝。

11 則留言:

  1. 我自己學ANDROID..只懂十分小的東西
    請見諒
    我跟了網上一個教學整了一個會員系統..我知道他將會員ID儲入了sqlite
    如果我只想讀取這個ID號碼應該怎辨??
    因為我想讀取這個ID傳去PHP搵出MYSQL關於這個ID的資料

    回覆刪除
    回覆
    1. sqlite還是會有PRIMARY KEY的
      你可以用這樣做:用一個下拉選單選出或EditText key入會員名稱什麼的
      送出去後去sqlite撈取此會員的ID,撈取後Get給PHP的Web service進MYSQL查詢
      關於這個ID的資料後傳送回來給你,然後把資料貼到手機介面上,就這樣
      記得撈取、傳送失敗等防呆記得要寫。

      刪除
    2. 問一個簡單問題
      當我在LOGIN頁面輸入了一個名稱在EditText(loginusername)
      當我去了第2頁,第2個ACTIVITY 我可以直接 (EditText) findViewById(R.id.loginusername)
      讀取這個資料??
      如果不可以
      我應該怎樣儲存這個名字...在任何地方可以讀取??

      刪除
    3. Activity之間傳送參數是用Intent,所以如果在第二頁要讀取必須由Intent帶過去第二頁
      無法由變數儲存,不然就是必須使用資料庫來儲存再由資料庫中撈出
      你也可以使用另一種方式只切換視窗而不是跳換Activity
      要知道Activity跳轉後都會載入layout的XML檔,只切換視窗就是在同一個Activity中
      只換XML檔而不是換Activity,這樣變數還是可以保留
      你可以上網找一下android切換視窗,基本上大概是下面這個樣子:
      setContentView(R.layout.t2);
      t2 是另一個xml的名稱
      重新載入另一個XML檔就會換頁了,細節上網找一下吧,網上很多資料。

      刪除
  2. 您好~~我想請問一下~能否寄給我這個專案的檔案~~
    因為我是初學還不是很清楚(要問問題可能會從很簡單問到難的~怕造成您困擾~所以我想說寄給我專案的檔案,我研究過後有問題再麻煩您解說這樣)!!!謝謝~
    heaven830419@gmail.com
    這是我的信箱~~
    謝謝您~~您是我的救星!~~
    我一定能從您那學到很多~~
    感激不盡~~

    回覆刪除
    回覆
    1. 因為這是從專案中copy出來使用的

      而這支專案是不可外流的,所以不方便給你!

      不好意思!

      刪除
    2. 好~~~謝謝您喔~~~那我試試看!有問題再問您~

      刪除
  3. 您好
    我想請問 如何把DB其中一欄的資料拿出來
    給button.settext();使用?

    回覆刪除
    回覆
    1. 把DB資料在一個void中取出存入全域陣列

      然後在onCreate()中

      把陣列中的值用button.settext設定button文字

      你想要的應該是這樣吧!

      刪除
  4. 請問一下:
    我目前是在開發平板,目前是用fragment,主畫面有多各layout〈客戶資訊、連絡方式、興趣、競爭對手、購買資訊....等〉,在不跳頁的狀況下,按下有些按鈕可以讓layout轉換的動作,本程式類似個人資料建檔〈不連網頁,純apk〉,請問每各layout都必須把資料存到sqlite,點擊名字時,會把每各layout的資料抓出來,這樣有什麼方法作比較好? 還有如果資料1000筆以上 會不會變很慢,有什麼方法解決嗎?

    回覆刪除
  5. 請教版主大神
    第三段的程式碼"資料庫查詢指令"
    應該放在專案的何處??
    是前面的Activity內嗎?
    寫在哪個部分宣告才是符合邏輯的呢??

    回覆刪除

您的寶貴建議是我前進的動力!