Android中SQLite數據庫學習心得

在Android平臺上,集成了一個嵌入式關係型數據庫—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮點數字)、TEXT(字符串文本)和BLOB(二進制對象)數據類型,雖然它支持的類型雖然只有五種,但實際上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等數據類型,只不過在運算或保存時會轉成對應的五種數據類型。 SQLite最大的特點是你可以保存任何類型的數據到任何字段中,無論這列聲明的數據類型是什麼。例如:可以在Integer字段中存放字符串,或者在布爾型字段中存放浮點數,或者在字符型字段中存放日期型值。但有一種情況例外:定義爲INTEGERPRIMARY KEY的字段只能存儲64位整數, 當向這種字段中保存除整數以外的數據時,將會產生錯誤。 另外,SQLite 在解析CREATETABLE 語句時,會忽略CREATETABLE 語句中跟在字段名後面的數據類型信息,如下面語句會忽略name字段的類型信息:

CREATETABLE person (personidinteger primary key autoincrement,name varchar(20))

Android提供了一個名爲SQLiteDatabase的類,該類封裝了一些操作數據庫的API,使用該類可以完成對數據進行添加(insert)、查詢(query)、更新(Update)和刪除(Delete)操作(這些操作簡稱爲CRUD)。

android中提供了一個數據的輔助類SQLiteOpenHelper來獲取數據的實例,此類爲抽象類,我們需要繼承這個類,並且重寫其中onCreate和onUpdate方法,onCreate方法是在數據庫實例創建的時候調用,在其中一般用來完成一些數據庫的初始化工作,例如創建數據庫表等。onUpdate方法是在數據庫的版本發生變化的時候由系統自動的調用,在其中,主要完成一些數據庫表的更新,例如字段的添加和刪除。SQLiteOpenHelper的構造方法指定了數據庫創建的上下文,數據庫文件的名稱,數據的使用的遊標工廠,數據庫的版本(SQLiteOpenHelper類沒有定義默認的構造方法,因此我們需要在我們自定義類中定義構造方法,調用父類的構造方法,構造方法的參數第一個參數是上下文對象,第二個參數爲我們創建的數據庫名稱,這個我們自定義,第三個參數是遊標工廠對象,如果設定爲空置那麼將使用系統默認的遊標工廠對象,第四個參數是版本號,推薦從1開始。

public class DBOpenHelper extends SQLiteOpenHelper {

	public DBOpenHelper(Context context) {
		super(context, "contacts", null, 1);
		}

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("create table person(name varchar(10),phone char(10));");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

	}

}

通過DBOpenHelper的實例調用getWritableDatabase()方法和getReadableDatabase()可以獲取數據庫對象實例,通過數據庫實例可以實現數據的增刪蓋改查,下面代碼實現了將對person表中的數據增刪改查

public class PersonDAO {
	private DBOpenHelper dbhelper;
	
	public PersonDAO(DBOpenHelper dbhelper){
		this.dbhelper = dbhelper;
	}
	
	
	public void save(Person person){
		SQLiteDatabase db =  dbhelper.getWritableDatabase();
		db.execSQL("insert into person values(?,?)", new String[]{person.getName(),person.getPhone()});
	}
	
	public void delete(String name){
		SQLiteDatabase db = dbhelper.getWritableDatabase();
		db.execSQL("delete from person where name = ?", new String[]{name});
	}
	
	public void update(Person oldperson,Person newPerson){
		SQLiteDatabase db =  dbhelper.getWritableDatabase();
		db.execSQL("update person set name = ?,phone = ? where name = ?", new String[]{newPerson.getName(),newPerson.getPhone(),oldperson.getName()})
;	}
	
	public Person find(String name){
		Person person = null;
		SQLiteDatabase db = dbhelper.getWritableDatabase();
		Cursor cursor = db.rawQuery("select * from person where name = ? ", new String[]{name});
		while(cursor.moveToNext()){
			String personName = cursor.getString(cursor.getColumnIndex("name"));
			String phone = cursor.getString(cursor.getColumnIndex("phone"));
			 person  = new Person(personName,phone);
		}
		return person;
		
	}
}

使用getWritableDatabase()方法和getReadableDatabase()兩個方法需要注意的地方:

首先,兩種方法的區別在於前一種方法是使用讀寫的方式打開數據庫,而後一種方法是以只讀的方法打開數據,在前一種方法中,如果數據庫磁盤佔滿了,那麼以讀寫的方式打開數據庫則會發生異常,需要用只讀的方式來打開數據庫,因此在只做查詢處理的情況下,我們一般採用只讀的方式打開數據庫。

其次,這兩個方法具有緩存的特點,兩次通過同一個對象的getWritableDatabase()(或者是getReadableDatabase())的方法獲取的數據庫操作實例是同一個對象,但是前提是第一次獲取後的數據庫操作實例沒有關閉。

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