1. 程式人生 > >學習Android的SQLite中增刪改查功能!

學習Android的SQLite中增刪改查功能!

文章目的:快速入門Android的SQLite增刪改查功能!

前言:通過之前文章的學習,你已經掌握了快速建立和升級資料庫的方法,接下來就該學習一下如何對錶中的資料進行操作了。我們可以對資料進行的操作有四種,即 CRUD。其中 C 代表新增(Create),R 代表查詢(Retrieve) ,U代表更新(Update) ,D代表刪除(Delete) 。每一種操作又各自對應了一種 SQL命令,新增資料時使用 insert,查詢資料時使用 select,更新資料時使用 update,刪除資料時使用 delete。

開發環境:

  • 編寫程式碼工具:Android Studio 2.2.2
  • compileSdkVersion 25
  • buildToolsVersion “25.0.0”
  • minSdkVersion 19
  • targetSdkVersion 25
  • compile ‘com.android.support:appcompat-v7:25.0.0’

提示:文章末尾下載專案時注意開發環境的更改,以免造成不必要的時間浪費。

一、新增資料

SQLiteDatabase 中提供了一個 insert()方法,這個方法就是專門用於新增資料的。它接收三個引數,第一個引數是表名,我們希望向哪張表裡新增資料,這裡就傳入該表的名字。第二個引數用於在未指定新增資料的情況下給某些可為空的列自動賦值 NULL, 一般我們用不到這個功能, 直接傳入 null 即可。 第三個引數是一個 ContentValues 物件, 它提供了一系列的 put()方法過載,用於向 ContentValues 中新增資料,只需要將表中的每個列名以及相應的待新增資料傳入即可。

首先,我們在佈局檔案中,建立一個Button來執行新增資料

<Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="新增資料"
       android:id="@+id/add_data"/>

我們修改 MainActivity中的程式碼

public class MainActivity extends AppCompatActivity {

    private Button mButton;
    private MySqlDataHelper helper;
    private Button add_data;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = ((Button) findViewById(R.id.creat));
        /*這個構造方法中接收四個引數,第一個引數是 Context,第二個引數是給資料庫建立一個名字,
        第三個引數允許我們在查詢資料的時候返回一個自定義的 Cursor,一般都是傳入 null。
        第四個引數表示當前資料庫的版本號,傳入1即可,更新的話,數字改成大於1的即可*/
        helper = new MySqlDataHelper(this, "BookStore.db", null, 2);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //執行寫入資料
                helper.getWritableDatabase();
            }
        });

        /**
         * 新增資料
         */
        add_data = ((Button) findViewById(R.id.add_data));
        add_data.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SQLiteDatabase db = helper.getWritableDatabase();
                ContentValues values = new ContentValues();
                //  開始組裝第一條資料
                values.put("name", "The Da Vinci Code");
                values.put("author", "Dan Brown");
                values.put("pages", 454);
                values.put("price", 16.96);
                db.insert("Book", null, values); //  插入第一條資料
                values.clear();
                //  開始組裝第二條資料
                values.put("name", "The Lost Symbol");
                values.put("author", "Dan Brown");
                values.put("pages", 510);
                values.put("price", 19.95);
                db.insert("Book", null, values); //  插入第二條資料
            }
        });
    }
}

在新增資料按鈕的點選事件裡面,我們先獲取到了 SQLiteDatabase 物件,然後使用ContentValues來對要新增的資料進行組裝。如果你比較細心的話應該會發現, 這裡只對 Book表裡其中四列的資料進行了組裝,id那一列沒並沒給它賦值。這是因為在前面建立表的時候我們就將 id 列設定為自增長了,它的值會在入庫的時候自動生成,所以不需要手動給它賦值了。接下來呼叫了 insert()方法將資料新增到表當中, 注意這裡我們實際上添加了兩條資料,上述程式碼中使用 ContentValues 分別組裝了兩次不同的內容,並呼叫了兩次 insert()方法。

接下來我們執行程式,點選button。


資料就建立好了,這裡就不去檢視db檔案的內容了。

二、更新資料

SQLiteDatabase 中也是提供了一個非常好用的 update()方法用於對資料進行更新,這個方法接收四個引數,第一個引數和insert()方法一樣,也是表名,在這裡指定去更新哪張表裡的資料。第二個引數是 ContentValues 物件,要把更新資料在這裡組裝進去。第三、第四個引數用於去約束更新某一行或某幾行中的資料,不指定的話預設就是更新所有行。

比如現在我們要修改我們建立好的資料庫(書)的一個價格,要怎麼操作呢?

首先修改 activity_main.xml 中的程式碼

<Button
android:id="@+id/update_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="更新資料"
/>
我們接著修改MainActivity中的程式碼
public class MainActivity extends AppCompatActivity {

    private Button mButton;
    private MySqlDataHelper helper;
    private Button add_data;
    private Button updata_data;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = ((Button) findViewById(R.id.creat));
        /*這個構造方法中接收四個引數,第一個引數是 Context,第二個引數是給資料庫建立一個名字,
        第三個引數允許我們在查詢資料的時候返回一個自定義的 Cursor,一般都是傳入 null。
        第四個引數表示當前資料庫的版本號,傳入1即可,更新的話,數字改成大於1的即可*/
        helper = new MySqlDataHelper(this, "BookStore.db", null, 2);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //執行寫入資料
                helper.getWritableDatabase();
            }
        });

        /**
         * 新增資料
         */
        add_data = ((Button) findViewById(R.id.add_data));
        add_data.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SQLiteDatabase db = helper.getWritableDatabase();
                ContentValues values = new ContentValues();
                //  開始組裝第一條資料
                values.put("name", "The Da Vinci Code");
                values.put("author", "Dan Brown");
                values.put("pages", 454);
                values.put("price", 16.96);
                db.insert("Book", null, values); //  插入第一條資料
                values.clear();
                //  開始組裝第二條資料
                values.put("name", "The Lost Symbol");
                values.put("author", "Dan Brown");
                values.put("pages", 510);
                values.put("price", 19.95);
                db.insert("Book", null, values); //  插入第二條資料
            }
        });

        /**
         * 更新資料
         */
        updata_data = ((Button) findViewById(R.id.update_data));
        updata_data.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SQLiteDatabase db = helper.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put("price", 10.99);
                db.update("Book", values, "name = ?", new String[] { "The Da Vinci Code" });
            }
        });
    }
}

這裡在更新資料按鈕的點選事件裡面構建了一個 ContentValues 物件,並且只給它指定

了一組資料,說明我們只是想把價格這一列的資料更新成 10.99。 然後呼叫SQLiteDatabase

的 update()方法去執行具體的更新操作,可以看到,這裡使用了第三、第四個引數來指定具

體更新哪幾行。第三個引數對應的是 SQL 語句的 where 部分,表示去更新所有 name 等於?的行,而?是一個佔位符,可以通過第四個引數提供的一個字串陣列為第三個引數中的每個佔位符指定相應的內容。因此上述程式碼想表達的意圖就是,將名字是 The Da Vinci Code的這本書的價格改成 10.99。

我們執行程式後,價格資料就會被改變了。

三、刪除資料

SQLiteDatabase 中提供了一個delete()方法專門用於刪除資料,這個方法接收三個引數,第一個引數仍然是表名,這個已經沒什麼好說的了,第二、第三個引數又是用於去約束刪除某一行或某幾行的資料,不指定的話預設就是刪除所有行。

還是老樣子,修改 activity_main.xml中的程式碼
<Button
       android:id="@+id/delete_data"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="刪除資料"
       />

接著修改MainActivity的程式碼

public class MainActivity extends AppCompatActivity {

    private Button mButton;
    private MySqlDataHelper helper;
    private Button add_data;
    private Button updata_data;
    private Button delete_data;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = ((Button) findViewById(R.id.creat));
        /*這個構造方法中接收四個引數,第一個引數是 Context,第二個引數是給資料庫建立一個名字,
        第三個引數允許我們在查詢資料的時候返回一個自定義的 Cursor,一般都是傳入 null。
        第四個引數表示當前資料庫的版本號,傳入1即可,更新的話,數字改成大於1的即可*/
        helper = new MySqlDataHelper(this, "BookStore.db", null, 2);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //執行寫入資料
                helper.getWritableDatabase();
            }
        });

        /**
         * 新增資料
         */
        add_data = ((Button) findViewById(R.id.add_data));
        add_data.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SQLiteDatabase db = helper.getWritableDatabase();
                ContentValues values = new ContentValues();
                //  開始組裝第一條資料
                values.put("name", "The Da Vinci Code");
                values.put("author", "Dan Brown");
                values.put("pages", 454);
                values.put("price", 16.96);
                db.insert("Book", null, values); //  插入第一條資料
                values.clear();
                //  開始組裝第二條資料
                values.put("name", "The Lost Symbol");
                values.put("author", "Dan Brown");
                values.put("pages", 510);
                values.put("price", 19.95);
                db.insert("Book", null, values); //  插入第二條資料
            }
        });

        /**
         * 更新資料
         */
        updata_data = ((Button) findViewById(R.id.update_data));
        updata_data.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SQLiteDatabase db = helper.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put("price", 10.99);
                db.update("Book", values, "name = ?", new String[] { "The Da Vinci Code" });
            }
        });

        /**
         * 刪除資料
         */
        delete_data = ((Button) findViewById(R.id.delete_data));
        delete_data.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SQLiteDatabase db = helper.getWritableDatabase();
                db.delete("Book", "pages > ?", new String[] { "500" });
            }
        });
    }
}

可以看到,我們在刪除按鈕的點選事件裡指明去刪除 Book表中的資料, 並且通過第二、第三個引數來指定僅刪除那些頁數超過 500頁的書籍。當然這個需求很奇怪,這裡也僅僅是為了做個測試。你可以先檢視一下當前Book 表裡的資料,其中 The Lost Symbol 這本書的頁數超過了 500頁,也就是說當我們點選刪除按鈕時,這條記錄應該會被刪除掉。


執行程式,執行刪除資料,我們就達到了資料的刪除。

四、查詢資料

SQLiteDatabase 中提供了一個query()方法用於對資料進行查詢,這個方法的引數非常複雜,最短的一個方法過載也需要傳入七個引數。那我們就先來看一下這七個引數各自的含義吧,第一個引數不用說,當然還是表名,表示我們希望從哪張表中查詢資料。第二個引數用於指定去查詢哪幾列,如果不指定則預設查詢所有列。第三、第四個引數用於去約束查詢某一行或某幾行的資料,不指定則預設是查詢所有行的資料。第五個引數用於指定需要去 group by的列,不指定則表示不對查詢結果進行 group by操作。第六個引數用於對 group by之後的資料進行進一步的過濾,不指定則表示不進行過濾。第七個引數用於指定查詢結果的排序方式,不指定則表示使用預設的排序方式。更多詳細的內容可以參考下表。其他幾個 query()方法的過載其實也大同小異,你可以自己去研究一下,這裡就不再進行介紹了。

query() 方法引數  應 對應 SQL  部分  描述

table  fromtable_name  指定查詢的表名

columns  select column1,column2  指定查詢的列名

selection  where column =value  指定 where 的約束條件

selectionArgs  -  為 where中的佔位符提供具體的值

groupBy  group bycolumn  指定需要 group by的列

having  having column =value  對 group by後的結果進一步約束

orderBy  order by column1,column2  指定查詢結果的排序方式


修改activity_main中的程式碼

<Button
       android:id="@+id/query_data"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="查詢資料" />

修改MainActivity中的程式碼

/**
         * 查詢資料
         */
        query_data = ((Button) findViewById(R.id.query_data));
        query_data.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SQLiteDatabase db = helper.getWritableDatabase();
                //  查詢Book 表中所有的資料
                Cursor cursor = db.query("Book", null, null, null, null, null, null);
                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"));
                        Log.d("MainActivity", "book name is " + name);
                        Log.d("MainActivity", "book author is " + author);
                        Log.d("MainActivity", "book pages is " + pages);
                        Log.d("MainActivity", "book price is " + price);
                    } while (cursor.moveToNext());
                }
                cursor.close();
            }
        });

接下來我們執行程式,點選查詢資料,就可以達到我們要查詢的效果。

打印出的Logd的資料:

五、總結

Android中的資料庫是一大難點,但是如果仔細學習,記住建立,升級,增刪改查這幾個點,那麼其實使用起來也比較容易。

專案下載地址:http://pan.baidu.com/s/1nvLdMU9

歡迎大家加微信進行技術交流和提出意見, 歡迎大家關注我的微信公眾號,我一定會最快回復你!