Android Sqlite的使用

2019.1.20

弄了一下午,終于把這個sqlite稍微弄懂了,

參考了這兩篇博客:

SQLite數(shù)據(jù)庫基本用法demo

AndroidStudio3.0+保存并查看SQLite數(shù)據(jù)庫文件

一. 首先展示一下demo:
代碼在:SQLitedemo

sqliteTest

<與上面兩個博客中改善了表中數(shù)據(jù)的顯示>

基本實現(xiàn)了:

數(shù)據(jù)庫的建立;數(shù)據(jù)庫的增刪查改;

二. 主要思路流程:

  • 編寫DatabaseHelper類繼承自SQLiteOpenHelper類;

  • 完成頁面布局,layout;

  • 完成MainAvtivity的編寫,實現(xiàn)對組件的監(jiān)聽和增刪查改;

三. 具體實現(xiàn):

  1. 我們需要使用的數(shù)據(jù)庫是SQLite,AndroidSDK自帶的數(shù)據(jù)庫。

    在使用SQLite之前,我們先簡單了解一下SQLite。SQLite的特點是微型,輕量,占用資源低。
    Android 提供的SQLiteOpenHelper.java 是一個抽象類,用來幫助我們實現(xiàn)數(shù)據(jù)庫的操縱。
    此時需要在DatabaseHelper類中實現(xiàn)三個方法:構(gòu)造函數(shù),onCreate,onUpgrade。
    構(gòu)造函數(shù)

    //帶全部參數(shù)的構(gòu)造函數(shù),此構(gòu)造函數(shù)必不可少,name為數(shù)據(jù)庫名稱
    public DatabaseHelper(Context context, String name, CursorFactory factory, int version) {
        super(context, name, factory, version);
    }
    

    onCreate

    //創(chuàng)建數(shù)據(jù)庫sql語句 并 執(zhí)行,相當于初始化數(shù)據(jù)庫,這里是新建了一張表這個方法繼承自SQLiteOpenHelper,會自動調(diào)用,也就是會 當新建了一個DatabaseHelper對象時,就會默認新建一張表user,表里存著名為name項
    public void onCreate(SQLiteDatabase db) {
        String sql = "create table user(name varchar(20))";
        db.execSQL(sql);
    }
    

    onUpgrade

     //這里應當實現(xiàn)數(shù)據(jù)庫升級等操作,由于是簡 單demo,所以就不寫了
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
    }
    
  2. 新建布局文件,這里就不多說了,在下方的查詢結(jié)果顯示是srcollView

  3. MainActivity的編寫
    獲得按鈕組件;
    設(shè)置監(jiān)聽器;
    新建數(shù)據(jù)庫;

     //新建了一個名為test_db的數(shù)據(jù)庫
    DatabaseHelper databaseHelper = new DatabaseHelper(this,"test_db",null,1);
    SQLiteDatabase db = databaseHelper.getWritableDatabase();
    
    
  4. 實現(xiàn)對test_db數(shù)據(jù)庫中user表中數(shù)據(jù)的增刪查改
    (引自博客https://blog.csdn.net/midnight_time/article/details/80834198
    ① 增:插入數(shù)據(jù),首先需要new一個ContentValues,內(nèi)容值對象。
    所謂的內(nèi)容值,就是一個K,V 鍵值對,K指明字段名稱即列名稱,V指明字段值,即單元格內(nèi)容。然后將這個鍵值對放到ContentValues的對象values里面,再把攜帶著鍵值對的對象values插入user表中,代碼如下:

    case R.id.insert_button:
         ContentValues values = new ContentValues();
         values.put("name",insert_data);
         db.insert("user",null,values);
         break;
    

    ② 刪:刪除數(shù)據(jù),這里不需要生成ContentValues對象,直接從表user中delete符合要求的內(nèi)容即可,代碼如下:

      //刪除數(shù)據(jù)按鈕
      case R.id.delete_button:
           db.delete("user","name=?",new String[]{delete_data});
           break;
    

    ③ 改:更新數(shù)據(jù),這里和插入數(shù)據(jù)類似,需要new一個ContentValues對象,然后放入數(shù)據(jù),執(zhí)行update,代碼如下:

    case R.id.update_button:
          ContentValues values2 = new ContentValues();
          values2.put("name", update_after_data);
          db.update("user", values2, "name = ?", new String[]{update_before_data});
          break;
    

    ④ 查:查詢?nèi)繑?shù)據(jù),這里使用了Cursor游標進行查詢,游歷數(shù)據(jù)同時,把數(shù)據(jù)用換行符\n連接起來,再把所有數(shù)據(jù)展示到文本顯示框內(nèi),代碼如下:

      //查詢?nèi)繑?shù)據(jù)
      case R.id.query:
              //創(chuàng)建游標對象
              Cursor cursor = db.query("user", new String[]{"name"}, null, null, null, null, null);
              //利用游標遍歷所有數(shù)據(jù)對象
              //為了顯示全部,把所有對象連接起來,放到TextView中
              String textview_data = "";
              while(cursor.moveToNext()){
                  String name = cursor.getString(cursor.getColumnIndex("name"));
                  textview_data = textview_data + "\n" + name;
              }
              textView.setText(textview_data);
              break;
    

四、ContentValues的使用
ContentValues 有點想 map,就是一個鍵值對的存儲容器。
ContentValues 和 HashTable類似都是一種存儲的機制 但是兩者最大的區(qū)別就在于,contenvalues只能存儲基本類型的數(shù)據(jù),像string,int之類的,不能存儲對象這種東西,而HashTable卻可以存儲對象。ContentValues存儲對象的時候,以(key,value)的形式來存儲數(shù)據(jù)。
在往數(shù)據(jù)庫中插入數(shù)據(jù)的時候,首先應該有一個ContentValues的對象所以:

ContentValues initial = new ContentValues();
initial.put(key,values);
SQLiteDataBase db ;
db.insert(TABLE_NAME,null,initialValues);

插入成功就返回記錄的id否則返回-1;

示例代碼:一個簡單的插入

public long insert(String text) 
{
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(FIELD_TEXT, text);
    long row = db.insert(TABLE_NAME, null, cv);
    return row;
}

五、使用sqlite總結(jié)

  • SQLiteOpenHelper:抽象類,我們通過繼承該類,然后重寫數(shù)據(jù)庫創(chuàng)建以及更新的方法, 我們還可以通過該類的對象獲得數(shù)據(jù)庫實例,或者關(guān)閉數(shù)據(jù)庫!
    SQLiteDatabase:數(shù)據(jù)庫訪問類:我們可以通過該類的對象來對數(shù)據(jù)庫做一些增刪改查的操作
    Cursor:游標,有點類似于JDBC里的resultset,結(jié)果集!可以簡單理解為指向數(shù)據(jù)庫中某 一個記錄的指針!
  • onCreate(database):首次使用軟件時生成數(shù)據(jù)庫表
    onUpgrade(database,oldVersion,newVersion):在數(shù)據(jù)庫的版本發(fā)生變化時會被調(diào)用, 一般在軟件升級時才需改變版本號,而數(shù)據(jù)庫的版本是由程序員控制的,假設(shè)數(shù)據(jù)庫現(xiàn)在的 版本是1,由于業(yè)務的變更,修改了數(shù)據(jù)庫表結(jié)構(gòu),這時候就需要升級軟件,升級軟件時希望 更新用戶手機里的數(shù)據(jù)庫表結(jié)構(gòu),為了實現(xiàn)這一目的,可以把原來的數(shù)據(jù)庫版本設(shè)置為2 或者其他與舊版本號不同的數(shù)字即可!
  • Step 1:自定義一個類繼承SQLiteOpenHelper類
    Step 2:在該類的構(gòu)造方法的super中設(shè)置好要創(chuàng)建的數(shù)據(jù)庫名,版本號
    Step 3:重寫onCreate( )方法創(chuàng)建表結(jié)構(gòu)
    Step 4:重寫onUpgrade( )方法定義版本號發(fā)生改變后執(zhí)行的操作
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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