Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android數據存儲(三)----- SQLite數據庫存儲

Android數據存儲(三)----- SQLite數據庫存儲

編輯:關於Android編程

SQLite是Android系統內置的數據庫,是一種輕量級的關系型數據庫,它運算速度快,占用資源少,非常適合在移動設備上使用。同時,它不僅支持標准的SQL語法,還遵循了數據庫的ACID事務。

一、創建數據庫

Android為了讓我們方便地管理數據庫,提供了一個SQLiteOpenHelper幫助類,借助於這個類可以非常簡單地對數據庫進行創建和升級。

1 . SQLiteOpenHelper類介紹

該類是一個抽象類,其中包含兩個抽象方法,分別是onCreate()和onUpgrade()我們必須在自己的類中重寫這兩個方法,分別在兩個方法中實現創建、升級數據庫的邏輯。


SQLiteOPenHelper中還有兩個重要的實例方法,getReadableDatabase()和getWritableDatabase()這兩個方法都可以創建或打開一個現有的數據庫(如果數據庫存在則直接打開,否則創建一個新的數據庫),並返回一個可對數據庫進行讀寫操作的對象。不同的是,當數據庫不可寫入的時候(比如磁盤空間已滿),getReadableDatabase()返回的對象將以只讀方式打開數據庫,而getWritableDatabase()方法將拋出異常


SQLiteOpenHelper中有兩個構造方法可供重寫,一般使用參數少一點的那個構造方法。該構造方法接收四個參數,第一個參數是Context,第二個參數是數據庫名,第三個參數允許我們在查詢數據的時候返回一個自定義的Cursor,一般傳入null,第四個參數表示當前數據庫的版本號,可用於對數據庫進行升級操作。構建出SQLiteOPenHelper的實例之後,再調用它的getReadableDatabase()或getWritableDatabase()方法就能夠創建數據庫了。此時,重寫的onCreate()方法也會得到執行,所以通常會在這裡處理一些創建表的邏輯。

2 . SQLite的數據類型

integer —————— 整型 real ————————浮點型 text ————————文本類型 blob ————————二進制類型

3 . 代碼示例

1 . 首先創建一個Book表,建表語句如下:

create table Book(
    id integer primary key autoincrement,
    author text,
    price real,
    pages integer,
    name text
)

2 . 新建類繼承自SQLiteOpenHelper,重寫其中的構造方法和抽象方法。

public class MyDatabaseHelper extends SQLiteOpenHelper{

    //創建Book表的語句
    public static final String CREATE_BOOK = "create table Book("
            + "id integer primary key autoincrement, "
            + "author text, "
            + "price real, "
            + "pages integer, "
            + "name text)";
    private Context mContext;
    //參數較少的構造方法
    public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        //執行建表語句
        sqLiteDatabase.execSQL(CREATE_BOOK);
        Toast.makeText(mContext, "數據表創建成功", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

3 . 在Activity中通過點擊按鈕觸發創建數據庫操作。

public class SqliteActivity extends AppCompatActivity {
    private MyDatabaseHelper myDatabaseHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sqlite);
        //創建數據庫為BookStore.db,不返回自定義的Cursor,數據庫版本為1
        myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
        Button btnCreateDb = (Button) findViewById(R.id.create_db);
        btnCreateDb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //點擊按鈕創建數據庫,同時執行onCreate()中的建表語句
                myDatabaseHelper.getWritableDatabase();
            }
        });
    }
}

先使用構造函數獲得SQLiteOpenHelper實例,然後在點擊按鈕時觸發getWritableDatabase()方法,執行了數據庫創建,然後默認調用onCreate()方法在數據庫BookStore.db裡面創建數據表Book。

這個時候運行程序,數據庫BookStore.db和數據表應Book應該就創建好了。接下來我們要查看創建好的數據庫。


二、查看數據庫

這裡我們采用adb和sqlite3來查看創建的數據庫和數據表。

adb是Android SDK中自帶的一個調試工具,它可以通過命令行對連接在電腦上的真機或者模擬器進行調試。它存放在SDK的platform-tools目錄下 。你可以把該路徑加到環境變量裡面,以便在任意目錄下可以通過命令行使用adb工具。

由於我使用的是Genymotion 模擬器,並且使用的是Genymotion默認的自帶的adb工具,所以需要在Genymotion安裝目錄的tools目錄下找到adb工具。

1 . 打開命令行,輸入 adb shell打開adb交互命令行。


2 . 通過 cd 命令切換到指定目錄, cd /data/data/packagename/databases/,此處的packagename是指你項目的包名,通過輸入 ls 命令 查看該目錄下的文件。會發現有剛才創建的BookStore.db數據庫文件。


3 . 通過sqlite3來查看數據庫結構。繼續輸入 sqlite3 BookStore.db打開數據庫。輸入.table就可以看見剛剛創建的Book表,輸入.schema就可以看見看見建表語句。

如下圖:

這裡寫圖片描述

說明:
1 . 在 databases目錄下還會有一個BookStore.db-journal文件是為了讓數據庫能夠支持事務而產生的臨時文件。
2 . 輸入.table 之後還有一張表 android_metadata是每個數據庫都會自動生成的表。


三、升級數據庫
如果我們已經創建好了數據表Book,現在想再創建另一張數據表,我們是不能簡單在onCreate()方法裡面再添加

sqLiteDatabase.execSQL(CREATE_BOOK)

這句的,由於Book表已經存在,我們的onCreate()方法不會再執行,這樣就不能再創建數據表了。

解決方法有兩種:

卸載程序,此時數據庫也會被刪除,重新安裝程序運行,就會執行onCreate()方法,就會創建兩張數據表。 借助於onUpgrade()方法。要想讓onUpgrade()方法執行,我們只需要在new SQLiteOpenHelper時將數據庫的版本 改為大於2,這樣就會執行該方法,代碼如下。
myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);

同時修改onUpgrade()中的代碼:

public class MyDatabaseHelper extends SQLiteOpenHelper{

    //創建Book1表的語句
    public static final String CREATE_BOOK1 = "create table Book1("
            + "id integer primary key autoincrement, "
            + "author text, "
            + "price real, "
            + "pages integer, "
            + "name text)";

    //創建Book2表的語句
    public static final String CREATE_BOOK2 = "create table Book2("
            + "id integer primary key autoincrement, "
            + "author text, "
            + "price real, "
            + "pages integer, "
            + "name text)";
    private Context mContext;
    //參數較少的構造方法
    public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        //執行建表語句
        sqLiteDatabase.execSQL(CREATE_BOOK1);
        sqLiteDatabase.execSQL(CREATE_BOOK2);
        Toast.makeText(mContext, "數據表創建成功", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        sqLiteDatabase.execSQL("drop table if exists Book1");
        sqLiteDatabase.execSQL("drop table if exists Book2");
        onCreate(sqLiteDatabase);
    }
}

先看要新建的表是否存在,如果存在先刪除,然後在onUpgrade()方法中調用onCreate()方法創建數據表。


四、插入數據

上面我們在使用getReadableDatabase()創建和升級數據庫,其實它還會返回一個SQLiteDatabase對象,借助於這個對象我們對數據庫進行操作。

插入數據使用insert()方法,該方法接受三個參數,第一個參數是要插入數據的表名,第二個參數在未指定添加數據的情況下給某些可為空的列自動賦值NULL,一般直接傳入null即可,第三個參數是ContentValues對象,它提供一系列的put()方法以鍵值對的方式給每個列名傳入對應的數據。

//向數據庫中添加數據
private void addData() {
   db = myDatabaseHelper.getWritableDatabase();
   ContentValues contentValues1 = new ContentValues();
   contentValues1.put("name", "bingjian");
   contentValues1.put("author", "冰鑒");
   contentValues1.put("pages", 453);
   contentValues1.put("price", 16.0);
   //插入第一組數據
   db.insert("Book1", null, contentValues1);

   contentValues1.clear();

   contentValues1.put("name", "bingjian2");
   contentValues1.put("author", "冰鑒2");
   contentValues1.put("pages", 455);
   contentValues1.put("price", 12.0);
   //插入第二組數據
   db.insert("Book1", null, contentValues1);
}

接下來按照上面的方式使用adb和sqlite3打開BooStore數據庫,輸入select * from Book1;就可以查看的剛才插入的數據。如下圖:

這裡寫圖片描述

五、更新數據

更新數據使用update()方法,該方法有四個參數,第一個參數是表名,第二個參數是ContentValues對象,在這裡面組裝要更新的數據,第三第四個參數用於約束更新某一行或某幾行中的數據。不指定就是默認更新所有行。

private void updateData() {
    ContentValues contentValues = new ContentValues();
    contentValues.put("price", 10.99);
    db.update("Book1", contentValues, "name = ?", new String[]{"bingjian"});
}

上面的update()函數第三個參數對應的SQL語句的where部分,表示去更新所有name等於?的行,而?是一個占位符,可以通過第四個參數的字符串替換占位符。

六、刪除數據

更新數據使用delete()方法,該方法有三個參數,第一個參數是表名,第二、第三個參數是用於約束刪除某一行或某幾行中的數據。不指定就是默認刪除所有行。

//刪除數據庫中的數據
    private void deleteData() {
        db.delete("Book1", "pages > ?", new String[]{"400"});
    }

上面的代碼會刪除Book1表中的pages大於400的數據。也是使用了占位符來指定約束條件。

七、查詢數據

對sqlite數據庫的查詢使用query()方法,哎方法有很多不同的重載方式,其中參數最少的一種也需要以下七個參數,下表給出了每個參數的含義。

query() 方法參數 對應SQL部分 描述 table from table_name 指定查詢的表名 columns select column1, column2 指定查詢的列名 selection where column = value 指定where的約束條件 selectionsArgs - 為where中的占位符提供具體的值 groupBy group by column 指定需要group by 的列 having having column = value 對group by 後的結果進一步約束 orderBy order by column1, column2 指定查詢結果的排序方式

一般我們傳入query的幾個參數就可以獲取到要查詢的數據,該方法返回一個Cursor對象,查詢到的所有數據都將從這個對象中取出。

//從數據庫中查詢數據
private String queryData() {
    Cursor cursor = db.query("Book1", null, null, null, null, null, null);
    String content = "";
    if (cursor.moveToFirst()){
        do{
            //遍歷Cursor對象,取出數據(注意字段的類型)
            String name = cursor.getString(cursor.getColumnIndex("name"));
            String author = cursor.getString(cursor.getColumnIndex("author"));
            int pages = cursor.getInt(cursor.getColumnIndex("pages"));
            double price = cursor.getDouble(cursor.getColumnIndex("price"));
            content = content + name;
            content = content + author;
            content = content + String.valueOf(pages);
            content = content + String.valueOf(price);
        }while (cursor.moveToNext());
    }
    cursor.close();
    return content;
}

上面通過循環遍歷從cursor中取出了查詢結果。我們可以給query指定更多參數來獲取我們想要的數據。

七、使用SQL語操作數據庫

Android中可以直接通過函數執行SQL語句來操作數據庫。下面是是簡單的增刪改查的例子。

//添加數據
db.execSQL("insert into Book1(name, author, pages, price) values(?, ?, ?, ?)", new String[] {"mybook", "my", "123", "15.5"});
//刪除數據
db.execSQL("delete from Book1 where pages > ?", new String[] {"120"});
//更新數據
db.execSQL("update Book1 set price = ? where name = ?", new String[]{});
//查詢數據
db.rawQuery("select * from Book1", null);

以上就是sqlite的一些基礎知識。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved