1. 程式人生 > >Android:Sqlite的使用

Android:Sqlite的使用

   在剛接觸android的時候就知道有SQlite資料庫了,只不過向來對資料庫不太感冒,因此做安卓一段時間了都不太會使用Sqlite。於是使用各種sqlite的框架,用以替代。比如郭霖大神的Litepal。

不過使用第三方框架有時候也會出現各種問題,而且不懂sqlite的基本使用總感覺不太踏實啊。因此又一次重溫了sqlite的知識。並寫下來。

Android為了讓我們更加方便地管理資料庫,於是專門提供了一個叫做SQLiteIpenHelper的幫助類。畢竟也不是每個人都精通資料庫,相信也有不少開發者跟筆者一樣不太會使用資料庫,sql語句的。那麼這個幫助類正好可以幫助那些不懂sql語句的人去操作資料庫

使用SQLiteOpenHelper操作資料庫

建立資料庫:

使用SQliteIpenHelper建立資料表還是需要用到一點SQL語句的,如果對建立表的SQL語句不熟悉可以參考文章:


首先要知道SQLiteOpenHelper是一個抽象類。意味著我們要是用他的話必需要建立自己的一個類去繼承它。

接下來呢就建立一個DataBaseHelper的類繼承SQLiteOpenHelper可以發現SQLiteOpenHelper有幾個抽象方法需要我們去實現的,而且必需要有一個構造方法。

public class DataBaseHelper extends SQLiteOpenHelper {


    public DataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }


    @Override
    public void onCreate(SQLiteDatabase db) {
 
      

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

我們需要在自己的幫助類裡面重寫這兩個方法,看方法名可以猜到onCreate實在資料庫建立的時候會呼叫,而onUpgrade在升級資料庫的時候會呼叫。

那麼這裡先建立資料庫,建立資料庫很簡單,直接new一個幫助類的物件出來,並在幫組類的構造方法傳進相關引數就可以建立資料庫了。

 public DataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) 

上面就是幫助類的構造方法,第一個引數Context就不用說了,必須要有context才能對資料庫進行操作。第二個引數是資料庫名稱,第三個引數允許我們在查詢資料的時候返回一個自定義Cursor,這個引數一般為null。第四個表示當前資料庫的版本號。

因此在activity中建立一個叫做TestDB的資料庫並建立一張使用者表:User表,表中有id(主鍵),使用者名稱,密碼三列。

首先要建立一個幫助類的例項:

DataBaseHelper helper= new DataBaseHelper(this, "TestDB",null,1);

版本號這裡我們先傳入1;

要建立一張User表,也需要一點SQL語句的功力,建立User表的語句如下所示:

 final static String CREATE_NEW_TABLE = "create table user(id integer primary key autoincrement," +
            "username text," +
            "password text" +
            ")";

上面的就是用java字串拼湊成的建表語句,稍微對sql語句熟悉的人都可以看到建立一張user表,表中有三列,其中id為整形的主鍵,主鍵自增長。然後還有兩列是文字烈性的使用者名稱與密碼。

那麼怎麼去執行這段sql語句呢?

剛才建立資料庫的時候,我們把這句sql語句放在onCreate裡面執行:

 public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_NEW_TABLE);
        Toast.makeText(mContext,"建立成功",Toast.LENGTH_SHORT).show();

    }
那麼怎樣才能使onCreate呼叫呢?上面說過在資料庫建立的時候onCreate會被呼叫。而我們只需要使用幫助類的例項呼叫getReadable或getWriteDatabase就會建立資料庫呼叫onCreate,並獲得資料庫操作物件SQLiteDatabase。如果資料庫已經被建立則不會再建立資料庫,並且不會再次呼叫onCreate。

利用剛才例項化的helper呼叫getWriteDatabase獲取一個SQLiteDatabase:

  SQLiteDatabase database = helper.getWritableDatabase();

有了database物件就可以對資料表進行增刪改查(crud)。

升級資料庫

剛才說到如果資料庫存在的話再呼叫getReadable或getWriteDatabase就不會再呼叫onCreate。如果我們需要在這個資料庫上在增加一個表那怎麼辦呢? 沒關係,我們不是還有一個onUpgrade的方法沒用到嗎,onUpgrade就是為了應對這種情況的。我們在例項化helper的時候往構造方法傳入的四個引數中,最後一個引數是版本好,上面我們傳入了1.如果這個時候我們傳入2的話。就會呼叫onUpgrade方法了。比如我們還需要建一個表book.那麼我們只需要在onUpgrade中的使用 SQLiteDatabase執行建表語句就可以了。

新增資料

讀到這裡可能有讀者會說:你在文章開頭不是說SQLiteIpenHelper是給對sql語句不熟悉的人使用的嗎?怎麼說了那麼多幾乎都要使用sql語句進行操作啊。 好吧~筆者並沒有坑大家,接下來新增資料的操作就不用到sql語句了~~~ 新增資料使用sql語句的話就要用insert XXXXXX的sql語句了。但是使用SQLiteIpenHelper的話,不需要使用sql語句都可以新增資料到資料庫。

首先把要新增到資料庫的資料裝進ContentValues裡面,下面就示範新增使用者毛毛,密碼maomao(毛毛是一條貴賓犬~~~每天都在筆者的宿舍亂蹦亂跳的):

  ContentValues value = new ContentValues();
            value.put("username", “毛毛”);
            value.put("password", "maomao");
            database.insert("user", null, value);
SQLiteDatabase中提供了一個insert()方法,這個方法專門用於新增資料的。接收三個引數,第一個引數是表名,表示向哪個表插入資料。第二個引數是用於在未指定新增資料的情況下給某些可為空的列自動賦值NULL,一般我們用不到這個功能傳入null即可。第三個引數是一個ContentValue物件,提供了一系列put方法的過載這點跟Map有點相似。只需要將表中的每個列名以及相應的待新增資料傳入即可。

就這樣就往user表中添加了使用者名稱為毛毛,密碼為maomao的使用者了。

更新資料

更新資料也就是資料庫中的增刪改查中的改,同樣的是使用SQLiteDatabase物件進行操作。

在SQLiteDatabase中有一個update(0方法用於對資料進行更新。這個方法接收四個引數,第一個引數同樣也是表名,指定更新哪張表的資料。

第二個引數是ContentValues物件,把更新的資料放進去。

第三,四個引數是約束更新哪一行中的資料。

上面添加了毛毛這個使用者,密碼為maomao。密碼與使用者名稱的關聯太大,導致密碼很容易被人破解因此需要對毛毛的密碼進行修改。這時應該怎樣做呢?

<pre name="code" class="java">    ContentValues values = new ContentValues();
            values.put("password", “laomao”);
            database.update("user", values, "username=?", new String[]{“毛毛”});


上述程式碼的意思是把username等於毛毛的那一行中的password列改成老毛。

刪除資料

同樣滴在SQLiteDatabase中有一個方法delete,用來刪除資料,刪除資料相對於上面的新增資料,更新資料更加簡單。 delete方法中第一個引數是表名,第二三個引數用於約束某一行或某幾行被刪除。不填寫的話則刪除所有資料。 栗子:刪除username為毛毛的使用者:
  database.delete("user", "username=?", new String[]{“毛毛”);

如果你能理解上面新增與更新的寫法,那麼刪除資料這麼簡單肯定能夠理解了。(偷懶路過)

查詢資料

之所以把crud四種操作之中r放在最後是因為查詢是最複雜的一種~從sql的中文就是(結構化查詢語言)可以知道大部分功能都體現在查詢這個功能上。sql的查詢博大精深,有興趣的可以看看筆者之前的部落格,有幾篇是關於MYsql的,其中會有不少sql語句的用法。,

接下來進入正題,SQLiteDatabase中有一個query方法用於查詢。可以發現query有好幾個過載,最短的那個也要傳入七個引數~這裡就簡單介紹一下簡單的用法~查詢博大精深篇幅所限說不完啊(又一次偷懶~~)

栗子:我想要查詢毛毛的密碼:

  Cursor cursor = database.query("user", new String[]{"password"}, "username=?", new String[]{”毛毛“}, null, null, null);
            if(cursor.moveToFirst()){
                int index = cursor.getColumnIndex("password");
                String password = cursor.getString(index);
                Toast.makeText(this, password, Toast.LENGTH_LONG).show();
            }

第一個引數依然是指定查詢哪個表,
第二個引數指定查詢的列,
第三個引數指定where約束條件
第四個引數為where重的佔位符提供具體的值
第五個引數制定需要group by的列
第六個引數對group by 後的結果進一步約束
第七個引數指定查詢結果的排序方式
雖然query方法引數多,但是並不是每次都需要把每個引數都用上的。query方法會返回一個Cursor物件。查詢到的所有資料都將從這個物件中取出~
最後提供一個小demo