1、爲何要會點SQLite?android
SQLite做爲一款輕量級的關係型數據庫,佔用的資源特別少,因此其應用場景也是特別的多。在移動開發中,咱們常常會有將數據存儲在本地的需求,此時SQLite將是咱們最佳的選擇。
可喜的是,SQLite已經被完美的集成在Android系統中,因此對於開發者而言,上手SQLite的難度又下降了很多。sql
2、開始玩玩SQLite數據庫
首先來講說在Android中操做SQLite數據庫的總體思路:app
一、自定義數據庫操做輔助類,並繼承自SQLiteOpenHelper類; 二、在Application中初始化SQLiteOpenHelper對象,並公開一個方法供其餘類調用獲取該對象; 三、根據SQLiteOpenHelper對象實例化SQLiteDatabase對象; 四、最後,咱們拿SQLiteDatabase對象便可進行SQLite數據庫的常規操做了。
其實整個流程並不複雜,稍微來點耐心,動動手指頭,再回頭瞧瞧SQLite,「哇哦,操做你如此簡單!」ide
一、自定義數據庫操做輔助類,並繼承自SQLiteOpenHelper類ui
import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; /** * author:silencezwm on 16/6/20 06:43 * email:silencezwm@gmail.com * description:數據庫操做輔助類 */ public class DBHelper extends SQLiteOpenHelper { //數據庫名稱 private static final String DBName = "study.db"; //數據庫版本號 private static final int DBVersion = 1; //構造方法 public DBHelper(Context context) { super(context, DBName, null, DBVersion); } @Override public void onCreate(SQLiteDatabase db) { //建立表---study db.execSQL("CREATE TABLE study ( _id integer PRIMARY KEY AUTOINCREMENT NOT NULL, bookName varchar, bookDesc varchar)"); } /** * 數據庫版本更新 * @param db 數據庫實例 * @param oldVersion 舊版本號 * @param newVersion 新版本號 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS study"); onCreate(db); } }
該類繼承了SQLiteOpenHelper,並實現了三個方法,其中onCreate()在數據庫初始化時會調用,onUpgrade()方法只有在數據庫新版本號大於舊版本號時纔會調用,即進行數據庫的更新操做。其中涉及到了經常使用SQL語句的書寫,看不懂的童鞋得抽空腦補一下這方面的知識哦。this
SQLiteOpenHelper有什麼用?.net
該SQLiteOpenHelper是Android平臺提供給咱們的數據庫輔助類,用於建立或打開數據庫。
二、在Application中初始化SQLiteOpenHelper對象,並公開一個方法供其餘類調用獲取該對象code
考慮到整個應用中的不一樣地方都有可能涉及到數據庫的操做,因此咱們有必要將該類的初始化放在咱們自定義的Application類中。就像該下:sqlite
public class MyApp extends Application { //數據庫輔助類實例 private static DBHelper mDBHelper; @Override public void onCreate() { super.onCreate(); mDBHelper = new DBHelper(getApplicationContext()); } //返回DBHelper實例, public static DBHelper getmDBHelper(){ return mDBHelper; } }
咱們來看看初始化SQLiteOpenHelper類源碼的實現方式
public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) { this(context, name, factory, version, null); }
參數含義解析:
context:上下文對象,這裏咱們傳入了ApplicationContext; name:數據庫名稱,這裏咱們定義爲"study.db"; factory:操做數據庫後返回的默認Cursor對象,這裏咱們默認爲null,後續須要保存返回的Cursor對象時,本身再進行構造; version:數據庫的版本號,初始版本號必須大於1,不然系統會拋IllegalArgumentException("Version must be >= 1, was " + version)異常。
三、根據SQLiteOpenHelper對象實例化SQLiteDatabase對象
該操做將會讓咱們獲得SQLiteDatabase對象,而一旦有了該對象,咱們就能夠進行數據庫的增刪改查操做了。該操做咱們能夠單獨封裝在某個類,一樣也能夠直接在某個Activity中實現。
核心代碼以下:
//獲取的數據庫對象 //其中 getWritableDatabase() 和 getReadableDatabase() 區別??? SQLiteDatabase db = MyApp.getmDBHelper().getWritableDatabase(); //SQLiteDatabase db = MyApp.getmDBHelper(). getReadableDatabase();
獲得SQLiteDatabase實例有以上兩種方法,兩種方法的主要區別在於:
在數據庫僅開放只讀權限或磁盤已滿時,getReadableDatabase只會返回一個只讀的數據庫對象。
另外在咱們每次初始化SQLiteDatabase對象時,系統都會進行數據庫版本號的判斷,該判斷的核心代碼以下(有興趣的童鞋能夠研究下getWritableDatabase()、getReadableDatabase()的源碼實現):
//獲取數據庫版本號,默認爲0 final int version = db.getVersion(); //若是老版本號與新版本號不一樣 if (version != mNewVersion) { //若是數據庫爲只讀,系統則會拋出"SQLiteException"異常 if (db.isReadOnly()) { throw new SQLiteException("Can't upgrade read-only database from version " + db.getVersion() + " to " + mNewVersion + ": " + mName); } //數據庫開啓事務 db.beginTransaction(); try { //表示數據庫第一次建立,則會進入咱們文章最上面自定義DBHelper類的onCreate()方法 if (version == 0) { onCreate(db); } else { //若是舊版本號大於新版本號,數據庫會」降級「,不然數據庫會」升級「 if (version > mNewVersion) { onDowngrade(db, version, mNewVersion); } else { onUpgrade(db, version, mNewVersion); } } //設置數據庫的最新版本號 db.setVersion(mNewVersion); //事務成功完成 db.setTransactionSuccessful(); } finally { //最後結束事務 db.endTransaction(); } }
四、拿SQLiteDatabase對象進行SQLite數據庫的常規操做
該下簡略介紹兩種操做方法:
一、使用SQL語句 二、使用Android封裝好的方法
咱們在初始化SQLiteDatabase對象的時候,建立了一個數據庫:study.db,並在數據庫中建立了一個表:study,表中包含主鍵自增 _id , 還有兩個字段:bookName、bookDesc。
該下代碼實現了往數據庫中插入、更新、查詢、刪除四種經常使用操做,此時你應該親自動手試試...
//插入數據 case R.id.btn_insert: //使用SQL語句 if (useSQL) { db.execSQL("insert into study values(null, ?, ?)", new Object[]{et_insert_book_name.getText().toString(), et_insert_book_desc.getText().toString()}); //使用Android封裝的方法 } else { //其中cv爲ContentValues的實例 cv.put("bookName", et_insert_book_name.getText().toString()); cv.put("bookDesc", et_insert_book_desc.getText().toString()); long isOK = db.insert("study", null, cv); //-1表明操做失敗 if (isOK == -1) { Toast.makeText(DBDemoActivity.this, "插入失敗", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(DBDemoActivity.this, "插入成功", Toast.LENGTH_SHORT).show(); } } break; //更新數據 case R.id.btn_update: if (useSQL) { db.execSQL("update study set bookName = ? where bookName = ?", new String[]{et_update_new_book_name.getText().toString(), et_update_book_name.getText().toString()}); } else { cv.put("bookName", et_update_new_book_name.getText().toString()); int updateCount = db.update("study", cv, "bookName = ?", new String[]{et_update_book_name.getText().toString()}); //更新後更新的個數,"0"表示更新失敗 if (updateCount != 0) { Toast.makeText(DBDemoActivity.this, "更新成功,共更新個數:" + updateCount, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(DBDemoActivity.this, "更新失敗", Toast.LENGTH_SHORT).show(); } } break; //查詢操做 case R.id.btn_query: if (useSQL) { Cursor cursor = db.rawQuery("select * from study", null); StringBuilder sb = new StringBuilder(); for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { sb.append("總數:" + cursor.getCount() + "\\\\n" + "書名:" + cursor.getString(cursor.getColumnIndex("bookName")) + "----該書簡介:" + cursor.getString(cursor.getColumnIndex("bookDesc"))); text_query_result.setText(sb.toString()); } //記得進行關閉哦 cursor.close(); } else { //查詢該表中全部數據 Cursor c = db.query("study", null, null, null, null, null, null); StringBuffer sb = new StringBuffer(); for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { sb.append("總數:" + c.getCount() + "\\\\n" + "書名:" + c.getString(c.getColumnIndex("bookName")) + "----該書簡介:" + c.getString(c.getColumnIndex("bookDesc"))); text_query_result.setText(sb.toString()); } //記得進行關閉哦 c.close(); } break; //刪除操做 case R.id.btn_del: if (useSQL) { db.execSQL("delete from study where bookName = ?", new String[]{et_del_book_name.getText().toString()}); } else { db.delete("study", "bookName = ?", new String[]{et_del_book_name.getText().toString()}); } break;
3、SQLite說
」555...又被你看穿了「