Android SQLite數(shù)據(jù)庫

SQLite介紹

SQLite是一款輕量級的關(guān)系型數(shù)據(jù)庫,它的運(yùn)算速度非???,占用資源很少,通常只需要幾百K的內(nèi)存就足夠了,因而特別適合在移動(dòng)設(shè)備上使用。SQLite采用的是動(dòng)態(tài)數(shù)據(jù)類型,會根據(jù)存入值自動(dòng)判斷,具有以下五種常用的數(shù)據(jù)類型:
NULL 值是一個(gè) NULL 值。
INTEGER 值是一個(gè)帶符號的整數(shù),根據(jù)值的大小存儲在 1、2、3、4、6 或 8 字節(jié)中。
REAL 值是一個(gè)浮點(diǎn)值,存儲為 8 字節(jié)的 IEEE 浮點(diǎn)數(shù)字。
TEXT 值是一個(gè)文本字符串,使用數(shù)據(jù)庫編碼(UTF-8、UTF-16BE 或 UTF-16LE)存儲。
BLOB 值是一個(gè) blob 數(shù)據(jù),完全根據(jù)它的輸入存儲。

SQLiteOpenHelper類

是 Android平臺提供給我們一個(gè)數(shù)據(jù)庫輔助類來創(chuàng)建或打開數(shù)據(jù)庫,一般先繼承這個(gè)類的實(shí)現(xiàn)相應(yīng)的方法。再用該類的對象獲取Database執(zhí)行增刪查改的操作。默認(rèn)打開/data/data/package/databases/應(yīng)用里的內(nèi)部數(shù)據(jù)庫執(zhí)行管理。

  • onCreate(SQLiteDatabase db) : 當(dāng)數(shù)據(jù)庫被首次創(chuàng)建時(shí)執(zhí)行該方法,一般將創(chuàng)建表等初始化操作在該方法中執(zhí)行。
  • onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version):當(dāng)打開數(shù)據(jù)庫時(shí)傳入的版本號與當(dāng)前的版本號不同時(shí)會調(diào)用該方法。
public class JsonDbHelper extends SQLiteOpenHelper {
    private static final String TAG = "JsonDbHelper";
    private static final String DB_NAME = "json_db";//數(shù)據(jù)庫名字
    public static String TABLE_NAME = "json";// 表名
    public static String FIELD_ID = "id";//
    public static String FIELD_NAME = "name";// 接口名
    public static String FIELD_TIME = "time";// 加載時(shí)間
    public static String FIELD_CONTENT = "content";// 接口內(nèi)容
    private static final int DB_VERSION = 1;   // 數(shù)據(jù)庫版本
    private static JsonDbHelper instance;

    public static JsonDbHelper getHelper(Context context) {
        if (instance == null)
            instance = new JsonDbHelper(context);
        return instance;
    }

    private JsonDbHelper(@Nullable Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //創(chuàng)建表 SQL語句
        //CREATE TABLE IF NOT EXISTS `runoob_tbl`(
        //   `runoob_id` INT UNSIGNED AUTO_INCREMENT,
        //   `runoob_title` VARCHAR(100) NOT NULL,
        //   `runoob_author` VARCHAR(40) NOT NULL,
        //   `submission_date` DATE,
        //   PRIMARY KEY ( `runoob_id` )
        //)ENGINE=InnoDB DEFAULT CHARSET=utf8;

        //SQLite采用的是動(dòng)態(tài)數(shù)據(jù)類型,會根據(jù)存入值自動(dòng)判斷,具有以下五種常用的數(shù)據(jù)類型
        //NULL  值是一個(gè) NULL 值。
        //INTEGER   值是一個(gè)帶符號的整數(shù),根據(jù)值的大小存儲在 1、2、3、4、6 或 8 字節(jié)中。
        //REAL  值是一個(gè)浮點(diǎn)值,存儲為 8 字節(jié)的 IEEE 浮點(diǎn)數(shù)字。
        //TEXT  值是一個(gè)文本字符串,使用數(shù)據(jù)庫編碼(UTF-8、UTF-16BE 或 UTF-16LE)存儲。
        //BLOB 值是一個(gè) blob 數(shù)據(jù),完全根據(jù)它的輸入存儲。
        String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "("
                + FIELD_ID + " INTEGER PRIMARY KEY AUTOINCREMENT , "
                + FIELD_NAME + " TEXT NOT NULL , "
                + FIELD_TIME + " INTEGER NOT NULL , "
                + FIELD_CONTENT + " TEXT NOT NULL);";
        try {
            db.execSQL(sql);
        } catch (SQLException e) {
            Log.e(TAG, "onCreate " + TABLE_NAME + "Error" + e.toString());
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //鏈接:https://juejin.im/post/59e7e5856fb9a0451542fb19
        //構(gòu)建刪除表的SQL
        String sql = "DROP TABLE IF EXISTS " + DB_NAME;
        // 將原來的表和數(shù)據(jù)直接刪除,然后再創(chuàng)建新的表,這是一種比較暴力而簡單
        db.execSQL(sql);
        onCreate(db);

        // 逐步升級的方案 較慢
//        if (newVersion > 1) {
//
//        }
//        if (newVersion > 2) {
//
//        }
    }
}

SQLiteDatabase類

SQLiteOpenHelper的實(shí)現(xiàn)類的對象調(diào)用 getWritableDatabase(),getReadableDatabase()返回的實(shí)例就是這個(gè)類的實(shí)例。也可以通過SQLiteDatabase的靜態(tài)方法返回實(shí)例:
db=SQLiteDatabase.openOrCreateDatabase("/data/data/com.lingdududu.db/databases/stu.db",null);

插入數(shù)據(jù)

  • SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues values)方法
    參數(shù)1 表名稱,
    參數(shù)2 空列的默認(rèn)值
    參數(shù)3 ContentValues類型的一個(gè)封裝了列名稱和列值的Map;
private void insert(SQLiteDatabase db)
{   
    // 實(shí)例化常量值   
    ContentValues cValue = new ContentValues();   
    // 添加用戶名   
    cValue.put("sname","xiaoming");   
    // 添加密碼   
    cValue.put("snumber","01005");   
    // 調(diào)用insert()方法插入數(shù)據(jù)   
    db.insert("stu_table",null,cValue);   
   }
  • 編寫插入數(shù)據(jù)的SQL語句,直接調(diào)用SQLiteDatabase的execSQL()方法來執(zhí)行
private void insert(SQLiteDatabase db)
{   
    //插入數(shù)據(jù)SQL語句
    String stu_sql="insert into stu_table(sname,snumber) values('xiaoming','01005')"; 
    //執(zhí)行SQL語句
    db.execSQL(sql);
   }

刪除數(shù)據(jù)

  • 調(diào)用SQLiteDatabase的delete(String table,String whereClause,String[] whereArgs)方法
    參數(shù)1 表名稱
    參數(shù)2 刪除條件
    參數(shù)3 刪除條件值數(shù)組
private void delete(SQLiteDatabase db) 
{   
    // 刪除條件
    String whereClause = "id=?";
    // 刪除條件參數(shù)
    String[] whereArgs = {String.valueOf(2)};
    // 執(zhí)行刪除
    db.delete("stu_table",whereClause,whereArgs); 
   }
  • 編寫刪除SQL語句,調(diào)用SQLiteDatabase的execSQL()方法來執(zhí)行刪除
private void delete(SQLiteDatabase db) 
{   
    // 刪除SQL語句
    String sql = "delete from stu_table where _id = 6";
    // 執(zhí)行SQL語句
    db.execSQL(sql);
   }

修改數(shù)據(jù)

  • 調(diào)用SQLiteDatabase的update(String table,ContentValues values,String whereClause, String[] whereArgs)方法
    參數(shù)1 表名稱
    參數(shù)2 跟行列ContentValues類型的鍵值對Key-Value
    參數(shù)3 更新條件(where字句)
    參數(shù)4 更新條件數(shù)組
private void update(SQLiteDatabase db) 
{   
    // 實(shí)例化內(nèi)容值 
    ContentValues values = new ContentValues();   
    // 在values中添加內(nèi)容   
    values.put("snumber","101003");   
    // 修改條件   
    String whereClause = "id=?";   
    // 修改添加參數(shù)   
    String[] whereArgs={String.valuesOf(1)};   
    // 修改   
    db.update("usertable",values,whereClause,whereArgs);   
   }
  • 編寫更新的SQL語句,調(diào)用SQLiteDatabase的execSQL執(zhí)行更新
private void update(SQLiteDatabase db)
{   
    // 修改SQL語句
    String sql = "update stu_table set snumber = 654321 where id = 1";
    // 執(zhí)行SQL
    db.execSQL(sql); 
   }

查詢數(shù)據(jù)

  • 在Android中查詢數(shù)據(jù)是通過Cursor類來實(shí)現(xiàn)的,當(dāng)我們使用SQLiteDatabase.query()方法時(shí),會得到一個(gè)Cursor對象,Cursor指向的就是每一條數(shù)據(jù)。它提供了很多有關(guān)查詢的方法,具體方法如下:
public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);

各個(gè)參數(shù)的意義說明:
參數(shù)table:表名稱
參數(shù)columns:列名稱數(shù)組
參數(shù)selection:條件字句,相當(dāng)于where
參數(shù)selectionArgs:條件字句,參數(shù)數(shù)組
參數(shù)groupBy:分組列
參數(shù)having:分組條件
參數(shù)orderBy:排序列
參數(shù)limit:分頁查詢限制

  • 編寫查詢的SQL語句,獲取Cursor 對象
 Cursor cursor = database.rawQuery("SELECT * FROM " + JsonDbHelper.TABLE_NAME + " WHERE " + JsonDbHelper.FIELD_NAME + "=?"
                , new String[]{name});
Cursor:返回值,相當(dāng)于結(jié)果集ResultSet

Cursor是一個(gè)游標(biāo)接口,提供了遍歷查詢結(jié)果的方法,如移動(dòng)指針方法move(),獲得列值方法getString()等.
Cursor游標(biāo)常用方法
getCount() 獲得總的數(shù)據(jù)項(xiàng)數(shù)
isFirst() 判斷是否第一條記錄
isLast() 判斷是否最后一條記錄
moveToFirst() 移動(dòng)到第一條記錄
moveToLast() 移動(dòng)到最后一條記錄
move(int offset) 移動(dòng)到指定記錄
moveToNext() 移動(dòng)到下一條記錄
moveToPrevious() 移動(dòng)到上一條記錄
getColumnIndexOrThrow(String columnName) 根據(jù)列名稱獲得列索引
getInt(int columnIndex) 獲得指定列索引的int類型值
getString(int columnIndex) 獲得指定列縮影的String類型值
示例:查詢數(shù)據(jù)

private void query(SQLiteDatabase db) 
{   
    // 查詢獲得游標(biāo)   
    Cursor cursor = db.query ("usertable",null,null,null,null,null,null);   
    // 判斷游標(biāo)是否為空   
    if(cursor.moveToFirst() 
    {   
        // 遍歷游標(biāo)   
        for(int i=0;i<cursor.getCount();i++)
        {   
            cursor.move(i);   
            // 獲得ID   
            int id = cursor.getInt(0);   
            // 獲得用戶名   
            String username=cursor.getString(1);   
            // 獲得密碼   
            String password=cursor.getString(2);   
            // 輸出用戶信息 
            System.out.println(id+":"+sname+":"+snumber);   
        }   
    }   
}

參考

Android黃金篇-SQLite數(shù)據(jù)庫

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容