SQLit數(shù)據(jù)庫 增 刪 改 查

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

  • Sqlite簡介
    Sqlite是一款輕型的數(shù)據(jù)庫响蕴,它包含在一個相對小的C庫中谆焊,它的設計目標是嵌入式的,由于它占用資源非常少浦夷,可能只需要幾百K的內存就可以了辖试,并且支持Windows/Linux/Unix等等主流的操作系統(tǒng),同時可以和很多種程序語言相結合劈狐,比如:C#/Java/php等罐孝,所以在嵌入式設備中特別受歡迎,這一點也正好符合android的開發(fā)要求肥缔,所以在Android開發(fā)中經(jīng)常要用到該數(shù)據(jù)庫莲兢。

  • SQlite內部結構
    在內部,Sqlite有以下幾個組件組成:SQL編譯器、內核改艇、后端以及附件收班。Sqlite通過利用虛擬機和虛擬數(shù)據(jù)庫引擎,是調試谒兄、修改和擴展Sqlite的內核變得更加方便摔桦,所有SQL語句被編譯成易讀的、可以在Sqlite虛擬機中執(zhí)行的程序集承疲。

  • android中Sqlite的使用方法
    在Android中要想使用Sqlite數(shù)據(jù)庫酣溃,首先應該創(chuàng)建一個類繼承SQLiteOpenHelper類,我們把這個類命名為DatabaseHelper纪隙,它作為一個訪問Sqlite的助手類赊豌,提供了兩方面的功能:

    • getReadableDatabase()/getWritableDatabase()可以獲得SQLiteDatabase對象,通過該對象可以對數(shù)據(jù)庫進行操作绵咱;
    • 提供OnCreate()和onUpgrade()兩個回調函數(shù)碘饼,允許我們在創(chuàng)建和升級數(shù)據(jù)庫時,進行自己的操作悲伶;
范例:
  • 數(shù)據(jù)庫助手類
  • 自定義MySQLiteOpenHelper類 繼承SQLiteOpenHelper
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    // 數(shù)據(jù)庫文件名
    private final static String DB_NAME = "my_database.db";
    // 數(shù)據(jù)庫版本號
    private final static int DB_VERSION = 1;
    // 數(shù)據(jù)庫表名
    public final static String TABLE_NAME = "table_person";

    /**
     * 創(chuàng)建數(shù)據(jù)庫文件
     *
     * @param context 上下文
     * @param name    數(shù)據(jù)庫文件名
     * @param factory 游標工廠, 如果為null,Android系統(tǒng)提供默認的游標
     * @param version 數(shù)據(jù)庫版本號
     */
    public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    //創(chuàng)建數(shù)據(jù)庫文件:
    public MySQLiteOpenHelper(Context context) {
        //創(chuàng)建了名為"my_database.db"數(shù)據(jù)庫,版本號 1  數(shù)據(jù)庫地址: data/data/com.w.Demo/databases/my_database.db
        super(context, DB_NAME, null, DB_VERSION);
    }

    /**
     * 創(chuàng)建了數(shù)據(jù)庫
     * @param db 系統(tǒng)返回的數(shù)據(jù)庫對象
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 創(chuàng)建表語句艾恼,語義:如果不存在則創(chuàng)建表,字段包括:主鍵_id麸锉,name钠绍,age
        /*注意: SQ語句: exists后面空格,()不要忘記*/
        String sql = "create table if not exists " + TABLE_NAME + "(_id integer primary key autoincrement, name varchar, age integer)";
        // 執(zhí)行創(chuàng)建表的數(shù)據(jù)庫語句
        db.execSQL(sql);
    }

    /**
     * @param db  系統(tǒng)返回的數(shù)據(jù)庫對象
     * @param oldVersion 舊版本
     * @param newVersion 新版本
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (oldVersion != newVersion) {
            Log.d("TAG", "onUpgrade: onUpgrade");
        }
    }
}
  • 使用數(shù)據(jù)助手類創(chuàng)建數(shù)據(jù)庫
MySQLiteOpenHelper mHelper =  new MySQLiteOpenHelper(this);
SQLiteDatabase dbSelect = mHelper.getReadableDatabase();
  • 具體增刪改查見下:

  • 創(chuàng)建或打開數(shù)據(jù)庫的方法

public SQLiteDatabase getDb() {
 //創(chuàng)建數(shù)據(jù)庫 my_database.db
        String filePath = Environment.getExternalStorageDirectory() + "/my_database.db";
        SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(filePath, null);
 //在數(shù)據(jù)庫中創(chuàng)建一張表 table_person
        String sql = "create table if not exists table_person(_id integer primary key autoincrement, name varchar, age integer)";
 // 執(zhí)行創(chuàng)建表的數(shù)據(jù)庫語句
        database.execSQL(sql);
        return database;
}
  • 插入數(shù)據(jù)
    • 插入單條數(shù)據(jù)
SQLiteDatabase dbAdd = getDb();
ContentValues values = new ContentValues();
                values.put("name", "林志玲");
                values.put("age", 18);
                // table:要插入數(shù)據(jù)的表名
                //nullColumnHack:當插入數(shù)據(jù)為null時,nullColumnHack不允許為空花沉,通過系統(tǒng)的處理保證了程序的穩(wěn)定性柳爽;當插入數(shù)據(jù)不為null時,nullColumnHack排不上用場碱屁,為null
                // values:插入的數(shù)據(jù)
                dbAdd.insert("table_person", null, values);
  • 使用SQ語句插入多條數(shù)據(jù)
//得到數(shù)據(jù)庫
  SQLiteDatabase dbAdd = getDb();
                // 開始事務
                dbAdd.beginTransaction();
                try {
                    for (int i = 0; i < 10; i++) {
                        // 插入數(shù)據(jù)
                        String sql = "insert into table_person(name, age) values('林志玲', " + i + ")";
                        dbAdd.execSQL(sql);
                    }
                   //事務成功
                    dbAdd.setTransactionSuccessful();
                } catch (Exception e) {

                } finally {
                    //結束事務
                    dbAdd.endTransaction();
                }
                //關閉數(shù)據(jù)庫,節(jié)約內存資源
                dbAdd.close();
  • Transaction事務: 事務開始和結束之間的代碼要嗎全部執(zhí)行要么不執(zhí)行

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

 SQLiteDatabase dbDelete = getDb();
                // 刪除數(shù)據(jù)庫指定表中的數(shù)據(jù)
                // table:表名
                // whereClause:刪除條件磷脯,格式“name = ?”
                // whereArgs:滿足刪除的條件,即刪除的數(shù)據(jù)娩脾,格式“"張三"”
                dbDelete.delete("table_person", "name = ?", new String[]{"林志玲"});
                dbDelete.close();
  • 修改數(shù)據(jù)
ContentValues contentValues = new ContentValues();
                contentValues.put("name", "張三");
                contentValues.put("age", 25);
                SQLiteDatabase dbModify = getDb();
                // table:表名
                // values:更新的數(shù)據(jù)
                // whereClause:更新條件
                // whereArgs:滿足更新的條件
                dbModify.update("table_person", contentValues, "name = ?", new String[]{"林志玲"});
                dbModify.close();
  • 查詢數(shù)據(jù)
               //得到數(shù)據(jù)庫;
                SQLiteDatabase dbSelect = getDb();
              // 查詢數(shù)據(jù)庫
                // table:表名
                // columns:被查詢的列(字段)赵誓,可以有很多個
                // selection:查詢條件
                // selectionArgs:滿足查詢的條件
                // groupBy:指定分組(多數(shù)情況不使用)
                // having:分組篩選數(shù)據(jù)關鍵字(多數(shù)情況不使用)
                // orderBy:排序
                Cursor cursor = dbSelect.query("table_person", new String[]{"name", "age"}, null, null, null, null, null);
                int nameIndex = cursor.getColumnIndex("name");
                int ageIndex = cursor.getColumnIndex("age");
                //遍歷數(shù)據(jù)庫查詢數(shù)據(jù)  
                while (cursor.moveToNext()) {
                    String name = cursor.getString(nameIndex);
                    int age = cursor.getInt(ageIndex);
                   showText = showText + "姓名: " + name + "\t年齡: " + age + "\n";
                }
                 Log.d("TAG", "數(shù)據(jù): " + showText );
                dbSelect.close();
                cursor.close();

-注意事項:

  • 若使用自定義的數(shù)據(jù)庫助手類創(chuàng)建了數(shù)據(jù)庫,數(shù)據(jù)庫存儲的位置為** data/data/com.w.Demo/databases/my_database.db**
  • 若使用創(chuàng)建或打開數(shù)據(jù)庫的方法,數(shù)據(jù)庫的位置為:/storage/emulated/0/my_database.db
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市柿赊,隨后出現(xiàn)的幾起案子俩功,更是在濱河造成了極大的恐慌,老刑警劉巖碰声,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诡蜓,死亡現(xiàn)場離奇詭異,居然都是意外死亡奥邮,警方通過查閱死者的電腦和手機万牺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洽腺,“玉大人脚粟,你說我怎么就攤上這事≌号螅” “怎么了核无?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長藕坯。 經(jīng)常有香客問我团南,道長,這世上最難降的妖魔是什么炼彪? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任吐根,我火速辦了婚禮,結果婚禮上辐马,老公的妹妹穿的比我還像新娘拷橘。我一直安慰自己,他們只是感情好喜爷,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布冗疮。 她就那樣靜靜地躺著,像睡著了一般檩帐。 火紅的嫁衣襯著肌膚如雪术幔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天湃密,我揣著相機與錄音诅挑,去河邊找鬼。 笑死泛源,一個胖子當著我的面吹牛揍障,可吹牛的內容都是我干的。 我是一名探鬼主播俩由,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼毒嫡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了幻梯?” 一聲冷哼從身側響起兜畸,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤避凝,失蹤者是張志新(化名)和其女友劉穎魔眨,沒想到半個月后蜗巧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體峦朗,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡酥诽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年瑟蜈,在試婚紗的時候發(fā)現(xiàn)自己被綠了骗村。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脂矫。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖在扰,靈堂內的尸體忽然破棺而出缕减,到底是詐尸還是另有隱情,我是刑警寧澤芒珠,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布桥狡,位于F島的核電站,受9級特大地震影響皱卓,放射性物質發(fā)生泄漏裹芝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一娜汁、第九天 我趴在偏房一處隱蔽的房頂上張望嫂易。 院中可真熱鬧,春花似錦掐禁、人聲如沸炬搭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宫盔。三九已至,卻和暖如春享完,著一層夾襖步出監(jiān)牢的瞬間灼芭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工般又, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留彼绷,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓茴迁,卻偏偏與公主長得像寄悯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子堕义,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內容