使用SQLite儲存數據

一、SQLite簡介  

  SQLite是一款開源的、嵌入式關係型數據庫,第一個版本Alpha發佈於2000年。SQLite在便攜性、易用性、緊湊性、高效性和可靠性方面有着突出的表現。

  SQLite和C/S模式的數據庫軟件不同,它是一款嵌入式數據庫,沒有獨立運行的進程,與所服務的應用程序在應用程序進程空間內共生共存。它的代碼與應用程序代碼也是在一起的,或者說嵌入其中,作爲託管它的程序的一部分。因此不存在數據庫的客戶端和服務器,使用SQLite一般只需要帶上它的一個動態庫,就可以享受它的全部功能。

  數據庫服務器在程序中的好處是不需要網絡配置或管理。將數據庫客戶端與服務器運行在同一個進程中,可以省去不少的操作及麻煩:不用擔心防火牆或者地址解析;不用浪費時間管理複雜的授權和權限;可以減少網絡調用相關的消耗;可以簡化數據庫管理並使程序更容易部署。

  SQLite數據庫通過數據庫級上的獨佔性和共享鎖來實現獨立事務處理。這意味着多個進程可以在同一時間從同一數據庫讀取數據,但是隻有一個可以寫入數據。在某個進程向數據庫執行寫操作之前,必須獲得獨佔鎖定。在發出獨佔鎖定後,其他的讀寫操作將不會再發生。

  此外,SQLite數據庫中的所有信息(比如表、視圖、觸發器等)都包含在一個文件內,方便管理和維護。SQLite數據庫還支持大部分操作系統,除電腦上使用的操作系統之外,很多手機上使用的操作系統同樣可以運行。同時,SQLite數據庫還提供了多語言的編程接口,供開發者使用。


二、建立我們的數據庫

  在MySQL等數據庫中,第一步是創建數據庫,第二步是創建表,如需要,還加上我們的初始預製的數據。在Android的SQLite的使用是一樣的。稍微特別一點是,我們需要通過繼承SQLiteOpenHelper這個類來達到目的。對於抽象類SQLiteOpenHelper的繼承,需要重寫構造方法、onCreate()和onUpgrade(),下面舉例介紹。

  這個例子,我們創建一個名爲bebook_db的數據庫,裏面有一個叫mytable的表格,有三列:_id,Name,Weight。下面我們將演示如何創建數據庫,如何在數據庫中創建表,如何刪除表,如何更新數據庫。

class Chapter22Db extends SQLiteOpenHelper{
	public static final String DATABASE_BAME ="bebook_db";
	// step 1 :重寫構造函數中,繼承super的構造函數,創建database
	public Chapter22Db(Context context){
		/* 在super中,
		 * 第一個參數 爲當前環境
		 * 第二個參數 String name爲數據庫文件,如果數據存放在內存 ,則爲null (不建議)
		 * 第三個參數 爲SQLiteDatabase.CursorFactory  factory,存放cursor,缺省設置爲null
		 * 第四個參數 爲int version數據庫的版本,從1開始,如果版本舊,則通過onUpgrade()進行更新(升級),
		 * 如果版本新則通過onDowngrade()進行發佈(降級)。
		 * 例如,我要更改mytable表格,增加一列,或者修改初始化的數據,或者程序變得複雜,我需要增加一個表,這時我需要在版本的數字增加
		 * 在加載時,纔會對SQLite中的數據庫個更新,這點非常重要,同時參見onUpgrade()的說明 */
		super(context,DATABASE_BAME,null,1);
	}

	/*step 2 :重寫onCreate(),如果Android系統中第一次創建我們的數據庫時,
	 * 即後面介紹調用getWritableDatabase()或者getReadbleDatabase()時,
	 * 將調用onCreate(),這這裏創建數據庫(雖然在構造函數中填入數據庫名,但數據庫的創建實在onCreate()中自動進行。
	 * 在這可以創建table,同時也可以寫入初始數據
	 * 總而言之,onCreate方法不需要手動調用*/
	public void onCreate(SQLiteDatabase db) {
		//execSQL方法用於執行不需要返回數據的SQL語句
		db.execSQL("CREATE TABLE mytable(_id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT,Weight REAL); ");
		//下面是初始化三個原始數據,對錶格進行增、刪、改、查,後面會詳細介紹。
		//下面的幾個數據來自Android自帶的重力表,據說是爲了傳感器管理用,Android已經考慮到我們在月球和火星上使用Android手機的情況^_^,程序員有時真的很無聊……
		//ContentValues是一種鍵值對應的數據儲存結構
		ContentValues cv = new ContentValues();
		cv.put("Name", "Gravity, Earth");
		cv.put("Weight", SensorManager.GRAVITY_EARTH);
		db.insert("mytable", "Name", cv);
		cv.put("Name", "Gravity, Mars");
		cv.put("Weight", SensorManager.GRAVITY_MARS);
		db.insert("mytable", "Name", cv);
		cv.put("Name", "Gravity, Moon");
		cv.put("Weight", SensorManager.GRAVITY_MOON);
		db.insert("mytable", "Name", cv);
	}

	/* step 3:重寫onUpgrade(),如果版本比原來的高,將調用onUpgrade()
	 * 通常,我們會刪除原來的表格,再根據新的需求創建*/
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		db.execSQL("DROP TABLE IF EXISTS mytable");
		//刪完了,別忘了調用onCreate(db)
		onCreate(db);
	}
}

三、和數據庫進行關聯

  就如同在MYSQL中進行數據庫的創建,表格創建和初始數據的填寫,而其他的操作一般在Activity中和用戶互動產生的。另外在Activity銷燬(onDestroy() )時,我們需要將連接斷開,以釋放有關資源。當然了,要不要釋放,在哪釋放,你來決定。

SQLiteDatabase db = null;
//獲取處理SQLiteOpenHelper的子類的SQLite的實例,如果只讀,可以採用getReadableDatabase()
//下面的例子例子我們將通過SQLiteDatabase實例的操作,來進行對數據進行增刪改查詢,所以採用可寫的方式。
//簡單來說,如果以前從未操作過該數據庫,那麼通過下面這一語句,數據庫和表就已經創建了
db= (new Chapter22Db (getApplicationContext())).getWritableDatabase();


四、對錶進行操作

  對錶格的操作有兩種方式,一種是RAW方式,即直接給出SQL語句(也就是前面出現的execSQL()方法),另一種是採用SQLiteDatabase中給出的方法來進行,姑且稱爲API方式,這種方法前面已經出現過,即db.insert("mytable", "Name", cv)這行。

  RAW方式:

  RAW方式很簡單,調用execSQL方法進行增加、刪除、更新操作均用SQL語句操作,比如:

db.execSQL("INSERT INTO mytable(Name,Weight) VALUES ('Test1',1.0);");
db.execSQL("DELETE FROM mytable WHERE Name='Test1';");   
db.execSQL("UPDATE mytable SET Weight=5.0 WHERE Name='Test1';");
  上面的三個操作都是無返回值的,而查詢SELECT則不然,將返回遊標Cursor:
Cursor corsor = db.rawQuery("SELECT _id,Name,Weight from mytable", null);
  獲取Cursor數據方法:

//移至第一行
corsor.moveToFirst();
while(!corsor.isAfterLast()){ 
	//參數0,即爲該行的首列
	int id = corsor.getInt(0); 
	//參數爲1,即爲該行第二列,以此類推
	String name = corsor.getString(1);
	double weight = corsor.getDouble(2);
	//取出的數據怎麼處理你來決定
	corsor.moveToNext();
}
//記得關掉
corsor.close();  


  API方式:

  API方式中,每一種目的都有不同的方法調用。簡單歸納如下:

  insert(String table, String nullColumnHack, ContentValues values)
  第一參數:數據庫表名;
  第二個參數如果CONTENT爲空時則向表中插入一列什麼(亦可爲null);
  第三個參數爲插入的內容。

  例:db.insert("mytable",null,values);

  delete(String table, String whereClause, String[] whereArgs)
  第一參數:數據庫表名;
  第二個參數表示條件語句(如"sex=?");
  第三個參數爲條件帶?的替代值,當然也可以直接在第二個參數中填充完畢。

  例:db.delete("mytable", "Name=?", {"Test1"});

    db.delete("mytable", "Name="Test1"", null);


  update(String table, ContentValues values, String whereClause, String[] whereArgs)
  第一個參數:數據庫表名;
  第二個參數更新的內容;
  第三個參數更新的條件;
  第四個參數條件帶?號的替代者,當然也可以直接在第三個參數中填充完畢。

  例:db.update("mytable",values,"Name=?",name);

    db.update("mytable",values,"Name="+name, null);


  至於查詢方法,也就是query()系列的函數,實在是太多了,大家可以自行查閱官方文檔(http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html)進行了解,實現方法也是大同小異。


  如果你對SQL語句不熟悉,那麼建議你稍微學習下。


以上部分內容轉載或參考來源如下:

http://www.cnblogs.com/menlsh/archive/2013/04/13/3019588.html

http://blog.csdn.net/flowingflying/article/details/6841070

在此表示感謝。
轉載請註明來源,版權歸原作者所有,未經同意嚴禁用於任何商業用途。
微博:http://weibo.com/theworldsong
郵箱:[email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章