概述
SQLite是一款輕量級的、小型的、開源的關系型數據庫,由于它的以上特點,所以它被作為Android平臺中的一個內置數據庫。今天,重點是如何在Android中使用SQLite數據庫,所以,接下來嘛,就讓我們用代碼,來了解下吧~
正文
首先創建數據庫。在Android中,系統提供了專門的幫助類SQliteOpenHelper,繼承這個類需要重寫以下兩個方法:
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
}
onCreate方法在數據庫創建的時候進行回調,在數據庫生成之后不會在進行調用。其中的參數SQLiteDatabase 表示數據庫對象。
onUpgrade方法在數據庫版本更新的時候進行回調,其中的三個參數分別表示數據庫對象,數據庫舊版本和數據庫新版本。
繼承這個類還必須有一個構造函數
public SQLiteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
第一個參數為上下文對象,第二個參數為要創建的數據庫名稱,第三個參數為一個可選的數據庫游標工廠類,當查詢(query)被提交時,該對象會被調用來實例化一個游標,最后一個參數表示要創建的數據庫版本。
接下來開始正式創建數據庫,首先,調用構造函數創建一個SQLiteHelper對象,
helper = new SQLiteHelper(this,"data.db",null,1);
這句話雖然把上下文對象,數據庫名稱,以及數據庫版本號都傳遞進來了,但是并沒有創建數據庫,而是當helper對象調用getWritableDatabase或getReadableDatabase方法時,才會創建數據庫對象(如果數據庫不存在)。這兩個方法都可以獲取一個用于操作數據庫的SQLiteDatabase實例。兩者之間的主要區別是:getWritableDatabase方法以讀寫的方式打開一個數據庫,一旦數據庫的磁盤空間滿了,打開就會出錯;而getReadableDatabase方法,先以讀寫的方式打開數據庫,如果數據庫的磁盤空間滿了,打開失敗,它還會繼續嘗試以只讀的方式打開數據庫。
可以看到,對應包名的目錄下,有了剛才創建的數據庫。
數據庫創建成功了,接下來就是創建表來進行數據的存儲管理。創建表結構一般在創建數據庫之后進行,創建表需要用到SQL語句來進行創建,然后調用SQLiteDatabase對象的方法execSQL來執行sql語句。
sqLiteDatabase.execSQL("create table test(_id Integer primary key,name varchar(20))");
有了數據庫,有了表,接下來就可以進行愉快的增刪改查啦~這里對于數據操作都有兩種方式,一種是自己寫sql語句,然后調用execSQL方法來執行,還有一種是調用SQLiteDatabase提供的方法,這里需要注意的一點是,每次使用完SQLiteDatabase對象進行增刪改查操作之后,都要記住調用SQLiteDatabase對象的close()方法,防止資源的占用。
public long insert(String table, String nullColumnHack, ContentValues values) ;
返回值表示新插入的行,返回-1表示出現異常,其中第一個參數表示插入表的名稱,第二個參數,SQL不允許插入空行,初始化為空時,這一列將會被顯示的賦一個null值,第三個參數ContentValues 為一個HashMap,存儲表中對應的字段和值。
還有修改和刪除。
public int update(String table, ContentValues values, String whereClause, String[] whereArgs)
返回值表示成功修改的行數,第一個參數表示修改的表名,第二個參數表示修改的字段和對應的數據,第三個參數表示修改的條件,如果為null,將會修改所有的行,最后一個參數表示如果第二個參數中的數據有"?"時,這個數組中的值將依次替換"?"。
public int delete(String table, String whereClause, String[] whereArgs)
返回值表示成功刪除的行數,第一個參數表示修改的表名,第二個參數表示刪除的條件,如果為null,則刪除所有行,第三個參數,如果在刪除條件中有"?"占位符,則這個數組中的值將依次替換"?"。
對于查詢,可以通過系統提供的兩個函數獲得結果。
public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
其中,返回值Cursor:查詢結果的記錄集,
table:要查詢數據的表名,
columns:要返回的列的列名數組,
selection:可選的where子句 ,如果其值為null,將會返回所有的行,
selectionArgs:當在selection中包含”?”時,如果selectionArgs的值不為null,則這個數組中的值將依次替換selection中出現的”?”,
groupBy:可選的group by子句,如果其值為null,將不會對行進行分組,
having:可選的having子句,如果其值為null,將會包含所有的分組,
orderBy:可選的order by子句,如果其值為null,將會使用默認的排序規則,
limit:可選的limit子句,如果其值為null,將不會包含limit子句。
public Cursor rawQuery(String sql, String[] selectionArgs)
返回值Cursor為查詢結果的記錄集,第一個參數為 一個查詢語句,第二個參數為查詢語句中占位符的值。
這里寫了一個小小的Demo用來熟悉了解各個方法的使用
Demo的地址如下,大家有興趣可以看下
SQLite使用Demo