安卓數據存儲(3):SQLite數據庫存儲

SQLite簡介

    Google爲Andriod的較大的數據處理提供了SQLite,他在數據存儲、管理、維護等各方面都至關出色,功能也很是的強大。SQLite具有下列特色:java

1.輕量級:使用 SQLite 只須要帶一個動態庫,就能夠享受它的所有功能,並且那個動態庫的尺寸想當小。android

2.獨立性:SQLite 數據庫的核心引擎不須要依賴第三方軟件,也不須要所謂的「安裝」。shell

3.隔離性:SQLite 數據庫中全部的信息(好比表、視圖、觸發器等)都包含在一個文件夾內,方便管理和維護。數據庫

4.跨平臺:SQLite 目前支持大部分操做系統,不至電腦操做系統更在衆多的手機系統也是可以運行,好比:Android。編程

5.多語言接口:SQLite 數據庫支持多語言編程接口。安全

6.安全性:SQLite 數據庫經過數據庫級上的獨佔性和共享鎖來實現獨立事務處理。這意味着多個進程能夠在同一時間從同一數據庫讀取數據,但只能有一個能夠寫入數據。ide

    Android爲了讓咱們可以更好的管理數據庫,專門提供了一個SQLiteOpenHelper幫助類,這是一個抽象類,所以要使用的話須要建立一個本身的幫助類去繼承它。SQLiteOpenHelper類中有兩個抽象方法,分別是onCreate(),和onUpgrade(),幫助類中必須重寫這兩個方法,而後在這兩個方法中去實現建立、升級數據庫的邏輯。SQLiteOpenHelper中有兩個重要的實例方法,getWritableDatabase()和getReadableDatabase().這兩個方法均可以建立或打開一個現有數據庫(若是數據庫已經存在,則直接打開,不然建立一個新的數據庫),並返回一個數據庫的寫讀操做對象。不一樣的是當數據庫不可吸入的時候(如磁盤已滿)getReadableDatabase()的方法返回的對象將以只讀的方式打開數據庫,而getWritableDatabase()則拋出異常。函數

    SQLiteOpenHelper中有兩個構造方法可供重寫,通常使用參數較少的那一個,即public DatabaseHelper(Context context, String name, CursorFactory factory,  int version),其中第一個參數是Context,必須有它才能對數據庫進行操做,第二個參數是數據庫的名字,第三個參數容許咱們在查詢數據時返回一個Cursor,通常傳入爲null,第四個參數是數據庫的版本號,可用於對數據庫的升級。經過代碼實現以下:this

    新建項目MySQLiteTest:在新建一個DatabaseHelper.java類,繼承SQLiteOpenHelper,同時修改activity_main.xml文件,添加以下代碼:spa

  <Button 
        android:id="@+id/create_database"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="建立數據庫"/>
    
    <Button 
        android:id="@+id/add_data"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/create_database"
        android:text="添加數據"/>
    
    <Button 
        android:id="@+id/up_data"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/add_data"
        android:text="更新數據"/>
    
    <Button 
        android:id="@+id/delete_data"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/up_data"
        android:text="刪除數據"/>
    
    <Button 
        android:id="@+id/query_data"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/delete_data"
        android:text="查詢數據"/>

    <Button 
        android:id="@+id/replace_data"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/query_data"
        android:text="使用事務替換數據"/>
activity_main.xml

在DatabaseHelper.java類中 新建一張Book表

public class DatabaseHelper extends SQLiteOpenHelper {
    
    public static final String CREATE_BOOK="create table Book("
            +"id integer primary key autoincrement,"
            +"author text,"
            +"price real,"
            +"page integer,"
            +"name text)";
    
    private Context myContext;
    public DatabaseHelper(Context context, String name, CursorFactory factory,
            int version) {
        super(context, name, factory, version);
        // TODO Auto-generated constructor stub
        myContext=context;
    }

    
    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL(CREATE_BOOK);
        Toast.makeText(myContext, "Create Success", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
        // TODO Auto-generated method stub

    }

}
DatabaseHelper

    這裏把建表的語句定義成一個字符串常量,而後在onCreate()方法中調用SQLiteDatabase的execSQL()方法來執行這條語句,並彈出「Create Success」,這樣便可以保證在數據庫建立完成的同時建立Book表。

    而後在MainActivity.java中點擊建立數據庫的按鈕,代碼爲:

定義一些變量:

private Button CreatBsesBtn;//建立數據庫
    private Button addDataBtn;//添加數據
    private Button udDataBtn;//更新數據
    private Button deleteDataBtn;//刪除數據
    private Button queryDataBtn;//插敘數據
    private Button replaceDataBtn;//替換數據
    private  DatabaseHelper mydb;
button
 mydb=new DatabaseHelper(this, "BookStore.db", null, 1);
         
         //添加數據庫
         CreatBsesBtn.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                mydb.getWritableDatabase();
            }
        });
添加數據庫

這裏經過構建一個DatabaseHelper,並經過構造函數的參數將數據庫的名字指定爲BookStore.db,版本號爲1,而後在點擊事件中調用getWritableDatabase()方法。這裏查看不具體說明,能夠用adb shell來對數據庫和表的建立狀況進行檢查,具體配置不在說明。

下面不具體說明,看代碼:

添加數據:

//添加數據
         addDataBtn.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                SQLiteDatabase db=mydb.getWritableDatabase();
                ContentValues cv=new ContentValues();
                //添加數據
                cv.put("name", "Android");
                cv.put("author", "jesson");
                cv.put("page", 120);
                cv.put("price", 75.0);
                db.insert("Book", null, cv);
                cv.clear();
                db.insert("Book",null, cv);
            }
        });
         
         
addData

在這個事件裏,先獲取到SQLiteDatabase對象,而後使用ContentValues來對要添加的數據進行組裝,由於id那一列設置的是自動增加,所以這裏只需四列就好了。最後調用insert()方法進行數據插入。

更新數據:

//更新數據
         udDataBtn.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                SQLiteDatabase db=mydb.getWritableDatabase();
                ContentValues cv=new ContentValues();
                cv.put("prices", 18.32);
                db.update("Book", cv, "name=?", new String[]{"Android"});
            }
        });
更新數據

這裏使用update()方法去執行具體更新操做,使用第三四個參數來指定具體更新的是哪一行的,也就是:將書名爲Android的書本價格改成 18.32(原來是75.0)。

刪除數據:

//刪除數據
         deleteDataBtn.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                SQLiteDatabase db=mydb.getWritableDatabase();
                db.delete("Book", "page>?", new String[]{"500"});
            }
        });
刪除數據:

這裏使用delete()方法去執行刪除操做,使用第二三個參數來指定具體刪除的是哪一行,這裏刪除頁數超過50頁的書。

 //查詢操做
         queryDataBtn.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                SQLiteDatabase db=mydb.getWritableDatabase();
                //查詢表中全部數據
                Cursor cursor=db.query("Book", null, null, null, null, null, null);
                if(cursor.moveToFirst()){
                    do{
                        String name=cursor.getString(cursor.getColumnIndex("name"));
                        String author=cursor.getString(cursor.getColumnIndex("author"));
                        int page=cursor.getInt(cursor.getColumnIndex("page"));
                        double price=cursor.getDouble(cursor.getColumnIndex("price"));
                    }while(cursor.moveToNext());
                }
                cursor.close();
            }
        });
查詢操做

SQLiteDatabase中提供一個query()方法對數據進行查詢,這個方法比較複雜,最短有七個參數,分別以下表所示:

query()方法參數 描述
table 指定查詢的表名(可爲null)
columns 指定查詢的列名(可爲null)
selection

指定where的約束條件(可爲null)

selectionArgs 爲where中的佔位符提供具體的值(可爲null)
groupBy 指定須要group by的列(可爲null)
having 對group by後的結果進一步約束(可爲null)
orderBy 指定查詢結果的排序方式(可爲null)

 

    調用query()方法後會返回一個Cursor對象,查詢到的全部數據都將從這個對象中取出。在本次查詢中,咱們在獲得Cursor對象後,調用它的moveToFirst()方法將數據的指針移動到第一行的位置,而後進入一個循環當中,去遍歷查詢到的每一行數據。在這個循環中,能夠經過getColumnIndex()方法獲取到每一列在表中對應的位置索引。最後別忘了關閉Cursor.

事務的使用,在下一篇裏進行介紹。

相關文章
相關標籤/搜索