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有什麼用?spa
該SQLiteOpenHelper是Android平臺提供給咱們的數據庫輔助類,用於建立或打開數據庫。
複製代碼
二、在Application中初始化SQLiteOpenHelper對象,並公開一個方法供其餘類調用獲取該對象.net
考慮到整個應用中的不一樣地方都有可能涉及到數據庫的操做,因此咱們有必要將該類的初始化放在咱們自定義的Application類中。就像該下:code
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...又被你看穿了「