Android鞏固之Sqlite使用

1.前言

剛開始學安卓開發的在課堂及書本上了解過sqlite,但嫌sqlite太老太繁瑣後來在公司中一直使用的是realm。無奈公司有的老項目是用的sqlite,因此再抽空學習一下。html


2.介紹

介紹沒啥好說的,簡單來講就是一個本地的輕量級關係型數據庫,最後是以文件的形式存儲在本地的。java


3. 使用

瞭解下來,sqlite的使用也很簡單,主要是要會sql語句。android

3.1 建庫、建表

android sdk 提供了一個抽象類SQLiteOpenHelper來幫助咱們使用sqlite,咱們只須要繼承它,實現抽象方法就可使用sqlite啦。git

image

解釋:
github

  • onCreate:SQLiteOpenHelper的抽象方法,數據庫第1次建立時則會調用,即第1次調用 getWritableDatabase / getReadableDatabase時調用。須要這裏執行數據庫建表語句。
  • onUpgrade: 數據庫版本升級的時候會調用,也是經過getWritableDatabase/ getReadableDatabase 時,發現本地數據庫和當前數據庫版本不一致觸發 能夠根據傳進來的oldVersion 版本號來對本地數據庫結構升級。
  • getReadableDatabase&getWritableDatabase:。獲取用來操做對錶增刪改查時的對象,均可建立或打開現有數據庫(數據庫已經存在則直接打開,沒有則建立),用於讀/寫數據庫。區別在於磁盤空間滿了的時候,數據庫不可寫用getWritableDatabase打開就會直接報錯,但getReadableDatabase打開失敗後會嘗試以只讀方式打開。

3.2 DML - 數據庫操做語言

3.2.1 增長

public void insertUser(User user) {

// ContentValues contentValues = new ContentValues();
// contentValues.put("name", user.getName());
// contentValues.put("age", user.getAge());
// db.insert(TB_NAME, null, contentValues);

        //使用sql語句增長
        String version2Sql = String.format("insert into user (age,name,sex) values (%d,'%s',%d)",user.getAge(),user.getName(),1);
        db.execSQL(version2Sql);
    }
複製代碼

解釋:
web

  • db: getWritableDatabase得到的數據表操做的SQLiteDatabase對象。
  • db.insert:經過調用insert方法,對數據表新增一條數據。傳入表名,以及對於的字段值,字段值經過ContentValues來傳入,也是一個鍵值對對象。中間的null是指:ContentValues爲空的時候的字段值,傳null就好。
  • db.execSQL:經過執行sql語句,執行新增,下面的刪除和更改數據一樣都是傳入對於的刪除和更改sql語句。

3.2.2 刪除

public void delByName(String name) {
// db.delete(TB_NAME, "name = ?", new String[]{name});

        //使用sql語句刪除
        String sql = String.format("delete from user where name='%s'",name);
        db.execSQL(sql);
    }
複製代碼

解釋:
sql

  • db.delete:調用delete方法刪除表記錄, 傳入表名,條件語句,條件語句中?的具體值。 注意中間的條件語句的編寫規則就是去掉正常sql語句中where。

3.2.3 更改

public void updateByName(User user, String name) {
//        ContentValues contentValues = new ContentValues();
//        contentValues.put("name", user.getName());
//        contentValues.put("age", user.getAge());
//        db.update(TB_NAME, contentValues, "name = ?", new String[]{name});

        //使用sql語句更改
        String sql = String.format("update user set age=%d , name='%s' where name='%s'",user.getAge(),user.getName(),name);
        db.execSQL(sql);
    }
複製代碼

解釋:
數據庫

  • db.update:傳入表名,更改後字段值,條件語句,條件語句中?的具體值。

3.3 查詢

public List<User> queryByName(String name) {
//        Cursor cursor = db.query(TB_NAME, null, "name = ?", new String[]{name}, null, null, null);

        //使用sql語句查詢
        Cursor cursor=db.rawQuery("select * from user where name = ? ",new String[]{name});

        List<User> orderList = new ArrayList<User>(cursor.getCount());
        if (cursor.getCount() > 0) {
            while (cursor.moveToNext()) {
                String newName = cursor.getString(cursor.getColumnIndex("name"));
                Integer newAge = cursor.getInt(cursor.getColumnIndex("age"));
                User order = new User(newName, newAge);
                orderList.add(order);
            }
        }
        cursor.close();
        return orderList;
    }
複製代碼

解釋:
數組

  • db.rawQuery: 經過sql語句查詢,傳入sql語句和語句中?表明的實際值的數組。
  • db.query: 經過調用query方法執行查詢,入參以下:
參數 意思
table 要操做的表
columns 查詢的列全部名稱集
selection WHERE以後的條件語句,可使用佔位符
groupBy 指定分組的列名
having 指定分組條件,配合groupBy使用
orderBy 指定排序的列名
limit 指定分頁參數
distinct 能夠指定「true」或「false」表示要不要過濾重複值
  • Cursor: Cursor是一個遊標接口,提供了遍歷查詢結果的方法,如移動指針方法move(),得到列值方法。Cursor遊標經常使用方法以下:
    image

4.總結

  • sqlite數據庫文件會存放在/data/data//databases/目錄下
  • getReadableDatabase和getWritableDatabase:。均可建立或打開現有數據庫
  • onCreate: 數據庫第1次建立時調用,這裏寫數據初始化語句。
  • onUpgrade: 數據庫版本升級的時候會調用, 在這裏根據傳進來的oldVersion 版本號來對本地數據庫結構升級。
  • sqlite 支持sql 語句,儘可能使用sql語句來增刪改查,比較方便,直觀,簡單。

5. 完整demo地址

6. 參考文章

6. 歷史文章目錄

相關文章
相關標籤/搜索