數(shù)據(jù)持久化-數(shù)據(jù)庫基礎(chǔ)SQLiteOpenHelper

Android基礎(chǔ)的SQLite使用

1. SQLiteOpenHelper

  1. 借助該類實(shí)現(xiàn)數(shù)據(jù)庫創(chuàng)建與升級
  2. 通過繼承實(shí)現(xiàn)該類獲取數(shù)據(jù)庫進(jìn)行數(shù)據(jù)操作
方法 描述 備注
SQLiteOpenHelper(@Nullable Context context, @Nullable String name, @Nullable CursorFactory factory, int version) 構(gòu)造方法 上下文赂毯、數(shù)據(jù)庫名芬首、游標(biāo)工廠類(默認(rèn)null)佑刷、數(shù)據(jù)庫版本號
onCreate(SQLiteDatabase db) 創(chuàng)建數(shù)據(jù)庫 使用db執(zhí)行設(shè)計配置好的數(shù)據(jù)庫建表語句進(jìn)行建表
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 升級數(shù)據(jù)庫 根據(jù)版本號不同進(jìn)行升級,發(fā)生在App低版本升級數(shù)據(jù)庫結(jié)構(gòu)有改變的情況下

2. 使用 CRUD Create Retrieve Update Delete

1.getWritableDatabase()與getReadableDatabase()

創(chuàng)建或打開一個現(xiàn)有的數(shù)據(jù)庫(如果已存在直接打開严望,否則創(chuàng)建一個),并返回一個可對數(shù)據(jù)庫進(jìn)行讀寫操作的對象;當(dāng)數(shù)據(jù)庫不可寫入時(磁盤空間已滿)竖伯,getWritableDatabase()會出現(xiàn)異常章母,getReadableDatabase()返回的對象將已只讀的方式打開

2.long insert(String table, String nullColumnHack, ContentValues values)

插入表名母蛛,自動賦值null(用于未指定添加數(shù)據(jù)的情況下給可空列自動賦值),數(shù)據(jù)集合

ContentValues contentValues = new ContentValues(); 
contentValues.put("name","日常消費(fèi)");
contentValues.put("details","飲食#水果#衣物"); 
DBUtils.insert(DBTables.TABLE_ACCOUNT_SORT,null, contentValues);

3.int delete(String table, String whereClause, String[] whereArgs)

表名乳怎,條件彩郊,條件字符串組

DBUtils.delete(DBTables.TABLE_ACCOUNT_SORT,"name = ?",new String[]{"日常消費(fèi)"});

4.int update(String table, ContentValues values, String whereClause, String[] whereArgs)

表名,更新的值集合蚪缀,條件秫逝,條件字符串組

ContentValues contentValues = new ContentValues();
contentValues.put("details","飲食#水果#衣物#交通"); 
DBUtils.update(DBTables.TABLE_ACCOUNT_SORT, contentValues, "name = ?", new String[]{"日常消費(fèi)"});

5.Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)

查詢表名,指定的列名(不指定默認(rèn)查詢所有列椿胯,約束條件(約束查詢某一行或某幾行的數(shù)據(jù)筷登,默認(rèn)查詢所有行),條件字符串集哩盲,指定分組的列(用于獲取分組匯總)前方,分組匯總的進(jìn)一步篩選狈醉,查詢結(jié)果指定排序

   Cursor cursor = DBUtils.query(DBTables.TABLE_ACCOUNT_SORT, null, null, null, null, null, null);
       if (cursor.moveToFirst()) {
           do {
               String name = cursor.getString(cursor.getColumnIndex("name"));
               String details = cursor.getString(cursor.getColumnIndex("details"));
               Log.e(TAG, "name: " + name);
               Log.e(TAG, "details: " + details);
           }while (cursor.moveToNext());
           cursor.close();
       }

3. 封裝

  1. DBHelper

    public class DBHelper extends SQLiteOpenHelper {
        public DBHelper(Context context) {
            super(context, DBTables.DB_NAME, null, DBTables.DB_VERSION);
        }
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(DBTables.ACCOUNT_SQL);
            db.execSQL(DBTables.ACCOUNT_SORT_SQL);
            db.execSQL(DBTables.ACCOUNT_DETAIL_SQL);
        }
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
    }
    
  2. DBTables

    public interface DBTables {
        String DB_NAME = "db.sqlite";
        int DB_VERSION = 1;
        String TABLE_ACCOUNT = "account";
        String ACCOUNT_SQL = "create table "+TABLE_ACCOUNT+"(" +
                "id integer primary key autoincrement," +
                "date varchar(20)," +
                "sort varchar(10)," +
                "detail varchar(10)," +
                "sum varchar(10)," +
                "source varchar(10)," +
                "income integer," +
                "type varchar(10)," +
                "reason varchar(10)," +
                "remark varchar(60)" +
                ")";
        String TABLE_ACCOUNT_SORT = "sort";
        String ACCOUNT_SORT_SQL = "create table "+TABLE_ACCOUNT_SORT+"(" +
                "name varchar(10) primary key," +
                "details varchar(100)" +
                ")";
        String TABLE_ACCOUNT_DETAIL = "detail";
        String ACCOUNT_DETAIL_SQL = "create table "+TABLE_ACCOUNT_DETAIL+"(" +
                "name varchar(10) primary key," +
                "budget varchar(100)" +
                ")";
    }
    
  3. DBUtils

    /**
     * Created by SJ on 2019/1/22.
     * 使用時需要在Application中初始化
     * 查詢操作時 需要及時關(guān)閉游標(biāo)與數(shù)據(jù)庫
     */
    public class DBUtils {
        private static DBHelper dbHelper;
        public static void init(Context context) {
            if (dbHelper == null) {
                dbHelper = new DBHelper(context);
            }
        }
        private static SQLiteDatabase getReadableDatabase() {
            if (dbHelper != null) {
                return dbHelper.getReadableDatabase();
            }else {
                throw new SQLException("DBUtils未初始化!");
            }
        }
    
        /**
         * 執(zhí)行增刪改SQL語句
         * @param sql
         */
        public static void execSQL(String sql) {
            SQLiteDatabase db = getReadableDatabase();
            db.execSQL(sql);
            db.close();
        }
    
        /**
         * 執(zhí)行增刪改SQL語句
         * @param sql 帶占位符的語句
         * @param bindArgs  實(shí)際value
         */
        public static void execSQL(String sql, Object[] bindArgs) {
            SQLiteDatabase db = getReadableDatabase();
            db.execSQL(sql, bindArgs);
            db.close();
        }
        /**
         * @param table 表名
         * @param nullColumnHack 指定為null的列
         * @param values 添加的值集合
         */
        public static void insert(String table, String nullColumnHack, ContentValues values) {
            SQLiteDatabase db = getReadableDatabase();
            db.insert(table,nullColumnHack,values);
            db.close();
        }
    
        /**
         * 刪除
         * @param table 表名
         * @param whereClause 刪除條件
         * @param whereArgs 條件對應(yīng)值
         */
        public static void delete(String table, String whereClause, String[] whereArgs) {
            SQLiteDatabase db = getReadableDatabase();
            db.delete(table,whereClause,whereArgs);
            db.close();
        }
    
        /**
         * 修改
         * @param table 表名
         * @param values 需要修改的值
         * @param whereClause 條件
         * @param whereArgs 條件對應(yīng)值
         */
        public static void update(String table, ContentValues values, String whereClause, String[] whereArgs) {
            SQLiteDatabase db = getReadableDatabase();
            db.update(table, values, whereClause, whereArgs);
            db.close();
        }
    
        /**
         *
         * @param table         String:表名
         * @param columns       String[]:要查詢的列名
         * @param selection     String:查詢條件
         * @param selectionArgs String[]:查詢條件的參數(shù)
         * @param groupBy       String:對查詢的結(jié)果進(jìn)行分組
         * @param having        String:對分組的結(jié)果進(jìn)行限制
         * @param orderBy       String:對查詢的結(jié)果進(jìn)行排序
         * @return 返回游標(biāo)惠险,使用后需要及時關(guān)閉游標(biāo)
         */
        public static Cursor query(String table, String[] columns, String selection,
                                   String[] selectionArgs, String groupBy, String having,
                                   String orderBy){
            SQLiteDatabase db = getReadableDatabase();
            return db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy);
        }
    
        /**
         * @param sql 帶占位符的查詢語句
         * @param selectionArgs 查詢條件實(shí)際值
         * @return 返回游標(biāo)苗傅,使用后需要及時關(guān)閉游標(biāo)
         */
        public static Cursor rawQuery(String sql, String[] selectionArgs){
            SQLiteDatabase db = getReadableDatabase();
            return db.rawQuery(sql,selectionArgs);
        }
    
        public static void colseDB(){
            dbHelper.close();
        }
    }
    
  4. 使用代碼及結(jié)果

            ContentValues contentValues = new ContentValues();
            contentValues.put("name", "日常消費(fèi)");
            contentValues.put("details", "飲食#水果#衣物");
            DBUtils.insert(DBTables.TABLE_ACCOUNT_SORT, null, contentValues);
            contentValues.clear();
            contentValues.put("details", "飲食#水果#衣物#交通");
            DBUtils.update(DBTables.TABLE_ACCOUNT_SORT, contentValues, "name = ?", new String[]{"日常消費(fèi)"});
            Cursor cursor = DBUtils.query(DBTables.TABLE_ACCOUNT_SORT, null, null, null, null, null, null);
            if (cursor.moveToFirst()) {
                do {
                    String name = cursor.getString(cursor.getColumnIndex("name"));
                    String details = cursor.getString(cursor.getColumnIndex("details"));
                    Log.e(TAG, "name: " + name);
                    Log.e(TAG, "details: " + details);
                } while (cursor.moveToNext());
                cursor.close();
            }
            DBUtils.delete(DBTables.TABLE_ACCOUNT_SORT, "name = ?", new String[]{"日常消費(fèi)"});
    
    image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市班巩,隨后出現(xiàn)的幾起案子渣慕,更是在濱河造成了極大的恐慌,老刑警劉巖抱慌,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逊桦,死亡現(xiàn)場離奇詭異,居然都是意外死亡抑进,警方通過查閱死者的電腦和手機(jī)强经,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寺渗,“玉大人匿情,你說我怎么就攤上這事⌒攀猓” “怎么了炬称?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涡拘。 經(jīng)常有香客問我玲躯,道長,這世上最難降的妖魔是什么鲸伴? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任府蔗,我火速辦了婚禮,結(jié)果婚禮上汞窗,老公的妹妹穿的比我還像新娘姓赤。我一直安慰自己,他們只是感情好仲吏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布不铆。 她就那樣靜靜地躺著,像睡著了一般裹唆。 火紅的嫁衣襯著肌膚如雪誓斥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天许帐,我揣著相機(jī)與錄音劳坑,去河邊找鬼。 笑死成畦,一個胖子當(dāng)著我的面吹牛距芬,可吹牛的內(nèi)容都是我干的涝开。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼框仔,長吁一口氣:“原來是場噩夢啊……” “哼舀武!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起离斩,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤银舱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后跛梗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寻馏,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年核偿,在試婚紗的時候發(fā)現(xiàn)自己被綠了操软。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡宪祥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出家乘,到底是詐尸還是另有隱情蝗羊,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布仁锯,位于F島的核電站耀找,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏业崖。R本人自食惡果不足惜野芒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望双炕。 院中可真熱鬧狞悲,春花似錦、人聲如沸妇斤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽站超。三九已至荸恕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間死相,已是汗流浹背融求。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留算撮,地道東北人生宛。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓县昂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親茅糜。 傳聞我的和親對象是個殘疾皇子七芭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容