Android——數據存儲之SQLite數據庫

一、SQLite簡介

     SQLite是D.Richard Hipp用C語言編寫的開源嵌入式數據庫引擎。它支持大多數的SQL92標準,並且可以在所有主要的操作系統上運行。

    ——支持高達2TB大小的數據庫

    ——每個數據庫以單個文件的形式存在

    ——每個文件以B-Tree的數據結構形式存儲在磁盤

二、特點主要包括:

    1. 輕量級   一個動態庫即單文件

    2. 獨立型   沒有依賴、無需安裝

    3. 隔離性   全部在一個文件夾中

    4. 跨平臺   支持衆多操作系統

    5. 多語言接口   支持衆多編程語言

    6. 安全性  事務處理的安全性

            ——通過數據庫上的獨佔性和共享鎖來實現獨立事務處理

            ——多個進程可以同一時間從同一數據庫讀取數據,但只有一個可以寫入數據。

三、SQLite的數據類型

      1. 支持NULL(空值)、INTEGER(整型值)、REAL(浮點值)、TEXT(字符串值)、BLOB(二進制對象)

      2. 動態數據類型(弱引用)

           當某個值插入到數據庫時,SQLite將會檢查它的類型,如果該類型與關聯的列不匹配,SQLite則會嘗試將該值轉換成該列的類型,如果不能轉換,則該值將作爲本身的類型存儲。

      注意:主鍵爲INTEGER時,再轉換類型就會報錯。

四、使用須知

    -由於資源佔用少、性能良好和零管理成本,嵌入式數據庫有了它的用武之地。如Android、IOS

    -沒有可用於SQLite的網絡服務器、只能通過網絡共享,可能存在文件鎖定或者性能問題。

    -只提供數據庫級的鎖定

    -沒有用戶賬戶概念,而是根據文件系統確定所有數據庫的權限。


五、在Android中如何使用SQLite(主要兩個類)

   -SQLiteDatabase  

  (1)提供了一些管理SQLite數據庫的類

  (2)提供創建,刪除,執行SQL命令,並執行其他常見的數據庫管理任務的方法。

  (3)每個程序的數據庫名字是唯一的,默認情況下是各自互相不干擾。

db.execSQL(sql)  //執行任何SQL語句
db.insert(table,nullColumnHack,values)
db.delete(table,whereClause,whereArgs)
db.update(table,values,whereClause,whereArgs)
db.query(table,columns,selection,selectionArgs,groupBy,having,orderBy)
db.rawQuery(sql,selectionArgs) //sql語句查詢

   -SQLiteOpenHelper 


1.創建一個數據庫並且打開(Activity間接繼承Content,Content提供方法openOrCreateDatabase())

SQLiteDatabase db= openOrCreateDatabase("name數據庫名字.db", mode權限——可讀可寫私有庫, factory可爲null);
db.execSQL("create table if not exists usertb (_id integer primary key autoincrement, name text not null,age integer not null, sex text not null)");//建議主鍵的名字一定寫上下劃線  完成表的創建
db.execSQL("insert into usertb(name,sex,age) values('張三','女',18)");
Cursor cursor = db.rawQuery("select * from usertb",null);//查詢結果存在Cursor對象中
if(cursor!=null){
  c.moveToFirst();//其實默認就在第一行
  while(cursor.moveToNext()){
       cursor.getInt(cursor.getColumnIndex("_id")); //取第一行的第一個字段
       cursor.getString(cursor.getColumnIndex("name")); //取第一行的第二個字段
       cursor.getInt(cursor.getColumnIndex("age")); //取第一行的第三個字段
       cursor.getString(cursor.getColumnIndex("sex")); //取第一行的第四個字段
  }
   cursor.close(); //關閉遊標、釋放內存
}
db.close();//釋放數據庫所佔內存


        Cursor是Android查詢數據後得到的一個管理數據集合的類,正常情況下,如果查詢得到的數據量較小時不會有內存問題,而且虛擬機能夠保證Cusor最終會被釋放掉。  然而如果Cursor的數據量特別大,特別是裏面有Blob信息時,應該保證Cursor佔用的內存被及時的釋放掉,而不是等待GC來處理。並且Android明顯是傾向於編程者手動的將Cursor close掉,因爲在源代碼中我們發現,如果等到垃圾回收器來回收時,也就是如果不手動關閉,系統會報錯,會給用戶以錯誤提示。

Cursor:遊標接口,提供了遍歷查詢結果的方法,如移動指針方法move(),獲得列值方法getString()等,常用方法:

getCount()//總記錄條數
isFirst() //判斷是否第一條記錄
isLast()  //判斷是否最後一條記錄
moveToFirst()  //移動到第一條記錄
moveToLast() //移動到最後一條記錄
move(int offset) //移動到指定記錄
moveToNext()  //移動到下一條記錄
moveToPrevious() //移動到上一條記錄
getColumnIndexOrThrow(String columnName) //據列名稱獲得列索引
getInt(int columnIndex)//獲得指定列索引的int類型值
getString(int columnIndex)//獲得指定列索引的String類型值

六、Android內置函數訪問SQLite數據庫

1. ContentValues: 這個類用來存儲一組可以被ContentResolver處理的值

   (1)ContentValues values = new ContentValues();//類似hashMap key value

   (2)values.put("name","張三");

   (3)執行對應的Sql操作

SQLiteDatabase db= openOrCreateDatabase("name數據庫名字.db", mode權限——可讀可寫私有庫, factory可爲null);
db.execSQL("create table if not exists stutb(_id integer primary key autoincrement, name text not null,age integer not null, sex text not null)");//建議主鍵的名字一定寫上下劃線  完成表的創建
ContentValues values = new ContentValues();
values.put("name","張三");
values.put("sex","男");
values.put("age",19);
long rowID = db.insert("stutb",null,values); //插入行的ID
values.clear();  //清空後重新put值,插入新值,就不需要重new ContentValues
values.put("name","張已");
values.put("sex","男");
values.put("age",20);
db.insert("stutb",null,values);
//更新
values.clear();
values.put("sex","女");
db.update("stub",values,"_id>?",new String[]{"3"}); //將所有ID大於3的性別改爲女
//刪除
db.delete("stutb","name like ?",new String[]{"%風%"});//刪除所有名字中帶有風的人
//查詢
Cursor c = db.query("stutb",null,"_id>?",new String[]{"0"},null,null,"name");
if(c!=null){
   String[] columns = c.getColumnNames();//獲取所有的字段名字
   while(c.moveToNext()){
       for(String columnName:columns){
           Log.i("info",c.getString(c.getColumnIndex(columnName)));
       }
   }
c.close();
}
db.close();

七、SQLiteOpenHelper——可以控制數據庫的初始化操作

1. SQLiteOpenHelper是SQLiteDatabase的幫助類,用於管理數據庫的創建和版本更新

2. 一般要建立一個類繼承它(名爲DBOpenHelper),並重寫構造函數及onCreate()和onUpgrade()方法

3. 方法說明

  (1)onCreate(SQLiteDatabase db)  首次創建數據庫時調用 如果以有這個庫,則不會自動回調該方法,一般可把建庫建表的操作放於此

           db.execSQL("create table if not exists stutb(_id integer primary key autoincrement,name text not null,sex text not null, age integer not null"));

           db.execSQL("insert into stutb(name,sex,age) values ('張上','女',14)");

  (2)onUpgrade(SQLiteDatabase db, int oldVersion, int new Version)  當數據庫的版本發生變化時自動調用

  (3)getReadableDatabase()  創建或打開一個只讀數據庫

  (4)getWritableDatabase()   創建或打開一個讀寫數據庫

4. 示例

DBOpenHelper helper = new DBOpenHelper(MainActivity.this,"stu.db");
//helper.getReadableDatabase();//獲取一個只讀數據庫,只能查詢
SQLiteDatabase db = helper.getWritableDatabase();
Cursor c=db.rawQuery("select * from stutb",null);
if(c!=null){
   //與上面ContenValues中一樣
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章