Google爲Andriod的較大的數據處理提供了SQLite,他在數據存儲、管理、維護等各方面都至關出色,功能也很是的強大。SQLite具有下列特色:java
1.輕量級:使用 SQLite 只須要帶一個動態庫,就能夠享受它的所有功能,並且那個動態庫的尺寸想當小。android
2.獨立性:SQLite 數據庫的核心引擎不須要依賴第三方軟件,也不須要所謂的「安裝」。shell
3.隔離性:SQLite 數據庫中全部的信息(好比表、視圖、觸發器等)都包含在一個文件夾內,方便管理和維護。數據庫
4.跨平臺:SQLite 目前支持大部分操做系統,不至電腦操做系統更在衆多的手機系統也是可以運行,好比:Android。編程
5.多語言接口:SQLite 數據庫支持多語言編程接口。安全
6.安全性:SQLite 數據庫經過數據庫級上的獨佔性和共享鎖來實現獨立事務處理。這意味着多個進程能夠在同一時間從同一數據庫讀取數據,但只能有一個能夠寫入數據。ide
Android爲了讓咱們可以更好的管理數據庫,專門提供了一個SQLiteOpenHelper幫助類,這是一個抽象類,所以要使用的話須要建立一個本身的幫助類去繼承它。SQLiteOpenHelper類中有兩個抽象方法,分別是onCreate(),和onUpgrade(),幫助類中必須重寫這兩個方法,而後在這兩個方法中去實現建立、升級數據庫的邏輯。SQLiteOpenHelper中有兩個重要的實例方法,getWritableDatabase()和getReadableDatabase().這兩個方法均可以建立或打開一個現有數據庫(若是數據庫已經存在,則直接打開,不然建立一個新的數據庫),並返回一個數據庫的寫讀操做對象。不一樣的是當數據庫不可吸入的時候(如磁盤已滿)getReadableDatabase()的方法返回的對象將以只讀的方式打開數據庫,而getWritableDatabase()則拋出異常。函數
SQLiteOpenHelper中有兩個構造方法可供重寫,通常使用參數較少的那一個,即public DatabaseHelper(Context context, String name, CursorFactory factory, int version),其中第一個參數是Context,必須有它才能對數據庫進行操做,第二個參數是數據庫的名字,第三個參數容許咱們在查詢數據時返回一個Cursor,通常傳入爲null,第四個參數是數據庫的版本號,可用於對數據庫的升級。經過代碼實現以下:this
新建項目MySQLiteTest:在新建一個DatabaseHelper.java類,繼承SQLiteOpenHelper,同時修改activity_main.xml文件,添加以下代碼:spa
<Button android:id="@+id/create_database" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="建立數據庫"/> <Button android:id="@+id/add_data" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/create_database" android:text="添加數據"/> <Button android:id="@+id/up_data" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/add_data" android:text="更新數據"/> <Button android:id="@+id/delete_data" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/up_data" android:text="刪除數據"/> <Button android:id="@+id/query_data" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/delete_data" android:text="查詢數據"/> <Button android:id="@+id/replace_data" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/query_data" android:text="使用事務替換數據"/>
在DatabaseHelper.java類中 新建一張Book表
public class DatabaseHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK="create table Book(" +"id integer primary key autoincrement," +"author text," +"price real," +"page integer," +"name text)"; private Context myContext; public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub myContext=context; } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub db.execSQL(CREATE_BOOK); Toast.makeText(myContext, "Create Success", Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { // TODO Auto-generated method stub } }
這裏把建表的語句定義成一個字符串常量,而後在onCreate()方法中調用SQLiteDatabase的execSQL()方法來執行這條語句,並彈出「Create Success」,這樣便可以保證在數據庫建立完成的同時建立Book表。
而後在MainActivity.java中點擊建立數據庫的按鈕,代碼爲:
定義一些變量:
private Button CreatBsesBtn;//建立數據庫 private Button addDataBtn;//添加數據 private Button udDataBtn;//更新數據 private Button deleteDataBtn;//刪除數據 private Button queryDataBtn;//插敘數據 private Button replaceDataBtn;//替換數據 private DatabaseHelper mydb;
mydb=new DatabaseHelper(this, "BookStore.db", null, 1); //添加數據庫 CreatBsesBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub mydb.getWritableDatabase(); } });
這裏經過構建一個DatabaseHelper,並經過構造函數的參數將數據庫的名字指定爲BookStore.db,版本號爲1,而後在點擊事件中調用getWritableDatabase()方法。這裏查看不具體說明,能夠用adb shell來對數據庫和表的建立狀況進行檢查,具體配置不在說明。
下面不具體說明,看代碼:
添加數據:
//添加數據 addDataBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub SQLiteDatabase db=mydb.getWritableDatabase(); ContentValues cv=new ContentValues(); //添加數據 cv.put("name", "Android"); cv.put("author", "jesson"); cv.put("page", 120); cv.put("price", 75.0); db.insert("Book", null, cv); cv.clear(); db.insert("Book",null, cv); } });
在這個事件裏,先獲取到SQLiteDatabase對象,而後使用ContentValues來對要添加的數據進行組裝,由於id那一列設置的是自動增加,所以這裏只需四列就好了。最後調用insert()方法進行數據插入。
更新數據:
//更新數據 udDataBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub SQLiteDatabase db=mydb.getWritableDatabase(); ContentValues cv=new ContentValues(); cv.put("prices", 18.32); db.update("Book", cv, "name=?", new String[]{"Android"}); } });
這裏使用update()方法去執行具體更新操做,使用第三四個參數來指定具體更新的是哪一行的,也就是:將書名爲Android的書本價格改成 18.32(原來是75.0)。
刪除數據:
//刪除數據 deleteDataBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub SQLiteDatabase db=mydb.getWritableDatabase(); db.delete("Book", "page>?", new String[]{"500"}); } });
這裏使用delete()方法去執行刪除操做,使用第二三個參數來指定具體刪除的是哪一行,這裏刪除頁數超過50頁的書。
//查詢操做 queryDataBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub SQLiteDatabase db=mydb.getWritableDatabase(); //查詢表中全部數據 Cursor cursor=db.query("Book", null, null, null, null, null, null); if(cursor.moveToFirst()){ do{ String name=cursor.getString(cursor.getColumnIndex("name")); String author=cursor.getString(cursor.getColumnIndex("author")); int page=cursor.getInt(cursor.getColumnIndex("page")); double price=cursor.getDouble(cursor.getColumnIndex("price")); }while(cursor.moveToNext()); } cursor.close(); } });
SQLiteDatabase中提供一個query()方法對數據進行查詢,這個方法比較複雜,最短有七個參數,分別以下表所示:
query()方法參數 | 描述 |
table | 指定查詢的表名(可爲null) |
columns | 指定查詢的列名(可爲null) |
selection | 指定where的約束條件(可爲null) |
selectionArgs | 爲where中的佔位符提供具體的值(可爲null) |
groupBy | 指定須要group by的列(可爲null) |
having | 對group by後的結果進一步約束(可爲null) |
orderBy | 指定查詢結果的排序方式(可爲null) |
調用query()方法後會返回一個Cursor對象,查詢到的全部數據都將從這個對象中取出。在本次查詢中,咱們在獲得Cursor對象後,調用它的moveToFirst()方法將數據的指針移動到第一行的位置,而後進入一個循環當中,去遍歷查詢到的每一行數據。在這個循環中,能夠經過getColumnIndex()方法獲取到每一列在表中對應的位置索引。最後別忘了關閉Cursor.
事務的使用,在下一篇裏進行介紹。