在剛接觸android的時候就知道有SQlite數據庫了,只不過向來對數據庫不太感冒,因此做安卓一段時間了都不太會使用Sqlite。於是使用各種sqlite的框架,用以替代。比如郭霖大神的Litepal。
不過使用第三方框架有時候也會出現各種問題,而且不懂sqlite的基本使用總感覺不太踏實啊。因此又一次重溫了sqlite的知識。並寫下來。
Android爲了讓我們更加方便地管理數據庫,於是專門提供了一個叫做SQLiteIpenHelper的幫助類。畢竟也不是每個人都精通數據庫,相信也有不少開發者跟筆者一樣不太會使用數據庫,sql語句的。那麼這個幫助類正好可以幫助那些不懂sql語句的人去操作數據庫
使用SQLiteOpenHelper操作數據庫
創建數據庫:
使用SQliteIpenHelper創建數據表還是需要用到一點SQL語句的,如果對創建表的SQL語句不熟悉可以參考文章:
MySql:操作表的語句以及常用的字段類型
首先要知道SQLiteOpenHelper是一個抽象類。意味着我們要是用他的話必需要創建自己的一個類去繼承它。
接下來呢就創建一個DataBaseHelper的類繼承SQLiteOpenHelper可以發現SQLiteOpenHelper有幾個抽象方法需要我們去實現的,而且必需要有一個構造方法。
public class DataBaseHelper extends SQLiteOpenHelper {
public DataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
我們需要在自己的幫助類裏面重寫這兩個方法,看方法名可以猜到onCreate實在數據庫創建的時候會調用,而onUpgrade在升級數據庫的時候會調用。
那麼這裏先創建數據庫,創建數據庫很簡單,直接new一個幫助類的對象出來,並在幫組類的構造方法傳進相關參數就可以創建數據庫了。
public DataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
上面就是幫助類的構造方法,第一個參數Context就不用說了,必須要有context才能對數據庫進行操作。第二個參數是數據庫名稱,第三個參數允許我們在查詢數據的時候返回一個自定義Cursor,這個參數一般爲null。第四個表示當前數據庫的版本號。
因此在activity中創建一個叫做TestDB的數據庫並創建一張用戶表:User表,表中有id(主鍵),用戶名,密碼三列。
首先要創建一個幫助類的實例:
DataBaseHelper helper= new DataBaseHelper(this, "TestDB",null,1);
版本號這裏我們先傳入1;
要創建一張User表,也需要一點SQL語句的功力,創建User表的語句如下所示:
final static String CREATE_NEW_TABLE = "create table user(id integer primary key autoincrement," +
"username text," +
"password text" +
")";
上面的就是用java字符串拼湊成的建表語句,稍微對sql語句熟悉的人都可以看到創建一張user表,表中有三列,其中id爲整形的主鍵,主鍵自增長。然後還有兩列是文本烈性的用戶名與密碼。
那麼怎麼去執行這段sql語句呢?
剛纔創建數據庫的時候,我們把這句sql語句放在onCreate裏面執行:
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_NEW_TABLE);
Toast.makeText(mContext,"創建成功",Toast.LENGTH_SHORT).show();
}
利用剛纔實例化的helper調用getWriteDatabase獲取一個SQLiteDatabase:
SQLiteDatabase database = helper.getWritableDatabase();
有了database對象就可以對數據表進行增刪改查(crud)。
升級數據庫
添加數據
首先把要添加到數據庫的數據裝進ContentValues裏面,下面就示範添加用戶毛毛,密碼maomao(毛毛是一條貴賓犬~~~每天都在筆者的宿舍亂蹦亂跳的):
ContentValues value = new ContentValues();
value.put("username", “毛毛”);
value.put("password", "maomao");
database.insert("user", null, value);
SQLiteDatabase中提供了一個insert()方法,這個方法專門用於添加數據的。接收三個參數,第一個參數是表名,表示向哪個表插入數據。第二個參數是用於在未指定添加數據的情況下給某些可爲空的列自動賦值NULL,一般我們用不到這個功能傳入null即可。第三個參數是一個ContentValue對象,提供了一系列put方法的重載這點跟Map有點相似。只需要將表中的每個列名以及相應的待添加數據傳入即可。就這樣就往user表中添加了用戶名爲毛毛,密碼爲maomao的用戶了。
更新數據
更新數據也就是數據庫中的增刪改查中的改,同樣的是使用SQLiteDatabase對象進行操作。
在SQLiteDatabase中有一個update(0方法用於對數據進行更新。這個方法接收四個參數,第一個參數同樣也是表名,指定更新哪張表的數據。
第二個參數是ContentValues對象,把更新的數據放進去。
第三,四個參數是約束更新哪一行中的數據。
上面添加了毛毛這個用戶,密碼爲maomao。密碼與用戶名的關聯太大,導致密碼很容易被人破解因此需要對毛毛的密碼進行修改。這時應該怎樣做呢?
<pre name="code" class="java"> ContentValues values = new ContentValues();
values.put("password", “laomao”);
database.update("user", values, "username=?", new String[]{“毛毛”});
上述代碼的意思是把username等於毛毛的那一行中的password列改成老毛。
刪除數據
database.delete("user", "username=?", new String[]{“毛毛”);
如果你能理解上面添加與更新的寫法,那麼刪除數據這麼簡單肯定能夠理解了。(偷懶路過)
查詢數據
之所以把crud四種操作之中r放在最後是因爲查詢是最複雜的一種~從sql的中文就是(結構化查詢語言)可以知道大部分功能都體現在查詢這個功能上。sql的查詢博大精深,有興趣的可以看看筆者之前的博客,有幾篇是關於MYsql的,其中會有不少sql語句的用法。,接下來進入正題,SQLiteDatabase中有一個query方法用於查詢。可以發現query有好幾個重載,最短的那個也要傳入七個參數~這裏就簡單介紹一下簡單的用法~查詢博大精深篇幅所限說不完啊(又一次偷懶~~)
栗子:我想要查詢毛毛的密碼:
Cursor cursor = database.query("user", new String[]{"password"}, "username=?", new String[]{”毛毛“}, null, null, null);
if(cursor.moveToFirst()){
int index = cursor.getColumnIndex("password");
String password = cursor.getString(index);
Toast.makeText(this, password, Toast.LENGTH_LONG).show();
}
第一個參數依然是指定查詢哪個表,
第二個參數指定查詢的列,
第三個參數指定where約束條件
第四個參數爲where重的佔位符提供具體的值
第五個參數制定需要group by的列
第六個參數對group by 後的結果進一步約束
第七個參數指定查詢結果的排序方式
雖然query方法參數多,但是並不是每次都需要把每個參數都用上的。query方法會返回一個Cursor對象。查詢到的所有數據都將從這個對象中取出~最後提供一個小demo