建立SQLite資料庫並實現增刪改查
(1)、除了可以使用檔案或SharedPreferences儲存資料,還可以選擇使用SQLite資料庫儲存資料。
(2)、在Android平臺上,集成了一個嵌入式關係型資料庫—SQLite,SQLite3支援NULL、INTEGER、REAL(浮點數字)、TEXT(字串文字)和BLOB(二進位制物件)資料型別,雖然它支援的型別只有五種,但實際上sqlite3也接受varchar(n)、char(n)、decimal(p,s)等資料型別,只不過在運算或儲存時會轉成對應的五種資料型別。 SQLite最大的特點是你可以把各種型別的資料儲存到任何欄位中,而不用關心欄位宣告的資料型別是什麼。例如:可以在Integer
CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))
SQLite可以解析大部分標準SQL
查詢語句:select * from 表名 where 條件子句 group by 分組字句 having ... order by 排序子句
如:select * from person
分頁SQL與mysql類似,下面SQL語句獲取5條記錄,跳過前面3條記錄
select * from Account limit 5 offset 3
插入語句:insert into 表名(欄位列表) values(值列表)。如: insert into person(name, age) values(‘趙靈兒’,3)
更新語句:update 表名 set 欄位名=值 where 條件子句。如:update person set name=‘趙靈兒‘ where id=10
刪除語句:delete from 表名 where 條件子句。如:delete
from person
(3)、SqlLite資料庫與桌面級的資料庫不同,回顧我們做java EE的時候,建資料庫與建表都是在本機完成的,但是在做安卓端開發的時候,我們不可能將所有使用者的手機都拿過來建資料庫。因此她提供一個類SQLiteOpenHelper,我們必須去繼承她才能使用。她裡面有兩個方法,getReadableDatabase()或者getWritableDatabase(),當用戶第一次實用軟體時,呼叫這兩個方法的任意一個就會自動建立資料庫。
(4)、新建安卓工程,應用名為資料庫應用,工程名為DB。新建一個類DBOpenHelper繼承SQLiteOpenHelper
(5)、需要生成父類構造器。Super(context,string,string,string):第一個引數代表傳入的上下文物件,第二個引數傳入要生成的資料庫的名稱,如果名稱需要字尾,用.連線,第三個引數是遊標工廠,用來產生遊標,作用是對查詢的結果集進行隨機訪問,傳入null代表使用系統預設的遊標物件,第四個引數是資料庫的版本,一般版本號標為1.
(6)、類中有兩個方法,一個是onCreate(SQLiteDatabase db)方法,她會在資料庫第一次被建立的時候呼叫,在這個方法裡特別適合生成應用需要的資料庫表。
Db.execSQL(“CREATE TABLE person(personid integer primary key autoincrement,name varchar(20))”)
(7)、當表結構需要修改升級的時候,應該修改版本號,從而觸發upgrade()方法。
例如額外新增欄位:db.execSQL(“ALTER TABLE person ADD phone VARCHAR(12) NULL”)
(8)、下面進行測試:呼叫read或者write方法,當執行測試方法後,建立的資料庫檔案會被建立在當前應用包下的databases資料夾下
(9)、在安卓中操作資料庫無需載入驅動,因為安卓系統已指定是sqlLIte資料庫 。
(10)、加入資料庫中欄位的javaBean屬性,編寫一個業務類,完成增刪改查,點選完成。
查詢所有結果需要使用分頁sql語句,分頁sql語句需要兩個引數,第一個是offset,第二個是查詢多少記錄(maxLength)。
Public ListfindScrolledData(int offset,int maxLength){
}
(11)、要對資料庫進行操作,首先要得到資料庫操作例項,可以通過SqLiteDatabase這個類來完成,然後在dbOpenHelper物件中傳入上下文物件,接著呼叫dbopenHelper物件的getWritableDataBase()方法得到操作例項。在save()方法中,接著呼叫SqlDataBase的execSQL()方法執行sql語句。其他方法同理
(12)、SQLiteDatabase還專門提供了對應於新增、刪除、更新、查詢的操作方法:insert()、delete()、update()和query() 。這些方法實際上是給那些不太瞭解SQL語法的菜鳥使用的,對於熟悉SQL語法的程式設計師而言,直接使用execSQL()和rawQuery()方法執行SQL語句就能完成資料的新增、刪除、更新、查詢操作。
Insert()方法用於新增資料,各個欄位的資料使用ContentValues進行存放。ContentValues類似於MAP,相對於MAP,它提供了存取資料對應的put(String
key, Xxx value)和getAsXxx(String key)方法,
SQLiteDatabase db = databaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", "龍幽");
values.put("age", 4);
long rowid = db.insert(“person”, null, values);//返回新添記錄的行號,與主鍵id無關
不管第三個引數是否包含資料,執行Insert()方法必然會新增一條記錄,如果第三個引數為空,會新增一條除主鍵之外其他欄位值為Null的記錄。Insert()方法內部實際上通過構造insert SQL語句完成資料的新增,Insert()方法的第二個引數用於指定空值欄位的名稱,相信大家對該引數會感到疑惑,該引數的作用是什麼?是這樣的:如果第三個引數values為Null或者元素個數為0, 由於Insert()方法要求必須新增一條除了主鍵之外其它欄位為Null值的記錄,為了滿足SQL語法的需要, insert語句必須給定一個欄位名,如:insert into person(name) values(NULL),倘若不給定欄位名 , insert語句就成了這樣:insert into person() values(),顯然這不滿足標準SQL的語法。對於欄位名,建議使用主鍵之外的欄位,如果使用了INTEGER型別的主鍵欄位,執行類似insert into person(personid) values(NULL)的insert語句後,該主鍵欄位值也不會為NULL。如果第三個引數values 不為Null並且元素的個數大於0 ,可以把第二個引數設定為null。
原始碼:
public class Person implements Serializable{
public class PersonService {
//
//
//
//
//