SQLite,輕量級(jí)數(shù)據(jù)庫(kù),非常適用于安卓的使用。
關(guān)于數(shù)據(jù)庫(kù)在安卓中的使用,主要包括以下幾點(diǎn):1、數(shù)據(jù)庫(kù)的創(chuàng)建與更新;2、數(shù)據(jù)庫(kù)的增加、修改、刪除;3、數(shù)據(jù)庫(kù)的查詢。之所以把數(shù)據(jù)庫(kù)的查詢也做為一點(diǎn),是因?yàn)樗牟樵兿鄬?duì)而言較為復(fù)雜。
一、數(shù)據(jù)庫(kù)的創(chuàng)建與更新
數(shù)據(jù)庫(kù)的創(chuàng)建依賴于SQLIteOpenHelper類(lèi),需要自己創(chuàng)建類(lèi)繼承該類(lèi),而該類(lèi)需要實(shí)現(xiàn)onCreate(),onUpgrade()以及一個(gè)構(gòu)造方法。
其中一般用的構(gòu)造方法需要用到四個(gè)參數(shù),一個(gè)是context,一個(gè)是數(shù)據(jù)庫(kù)的名字,一個(gè)是版本號(hào),一個(gè)只要寫(xiě)ull就可以了。有人直接將四個(gè)參數(shù)都作為自己的類(lèi)的構(gòu)造方法的參數(shù),而我在考慮后不建議如此;將數(shù)據(jù)庫(kù)的名字和版本號(hào)直接定義在自己創(chuàng)建的類(lèi)中,方便日后的升級(jí)等,參數(shù)只需要傳入context即可。
而在onCreate()方法中,則是對(duì)數(shù)據(jù)表的建立,這是較為簡(jiǎn)單的。語(yǔ)言如下:
create table tableName(字段名 ?字段屬性 ?[是否為主鍵] ?[是否自增],[字段名······])
最后使用db.execSQL(sql);來(lái)完成創(chuàng)建;
而在onUpgrade()方法中,就更為簡(jiǎn)單了,先刪除之前的數(shù)據(jù)表,再創(chuàng)建。如下:
db.execSQL("drop table if exists tableName");
onCreate(db);
為了方便,有人將表名、字段名定義在一個(gè)類(lèi)中,這就看個(gè)人喜歡了。參考代碼:

最后有一個(gè)在Activity中使用getWritableDatabase()或者getReadableDatabase()方法來(lái)實(shí)現(xiàn)數(shù)據(jù)庫(kù)創(chuàng)建;
private SQLiteDatabase database;
database = new CrimeBaseHelper(context).getWritableDatabase();
二、數(shù)據(jù)庫(kù)的增加、修改、刪除
數(shù)據(jù)庫(kù)的增、刪、改是較為簡(jiǎn)單的,而且有兩種方法,一種是android自帶的,另外一種是用sql語(yǔ)言來(lái)實(shí)現(xiàn),用什么也都是看自己的喜歡。
增加:
Android:使用ContentValues來(lái)封裝數(shù)據(jù)
ContentValues values = new ContentValues();
values.put(name,value);(保存多少數(shù)據(jù)都是這樣put進(jìn)去)
database.insert(tableName,null,values);//database是之間getWritableDatabase()得到的數(shù)據(jù)庫(kù)插入即可。
SQL方法:
database.execSQL("insert into tableName (字段名1,字段名2...) ?values (?,?,?)",new String[]{value1,value2...});
修改:
android方法:同意用ContentValues封裝數(shù)據(jù)
database.update(tableName,values,"條件(如:name=?)",new String[]{value});
SQL方法:
database.execSQL("update tableName set name = ? where name = ?",new String[]{value,value});
刪除:
Android方法:
database.delete(tableName,"條件(如:id>?)",new String[]{value});
SQL方法:
database.execSQL("delete from tableName where id > ?",new String[]{value});
總的來(lái)說(shuō),增刪改是比較簡(jiǎn)單的,但是在使用的時(shí)候要充分考慮代碼的重用性。這點(diǎn)要在摸索中前進(jìn)。
查詢
相對(duì)來(lái)說(shuō),查詢是較為復(fù)雜的,他需要用到一個(gè)叫做Cursor的東西,這個(gè)翻譯過(guò)來(lái)叫游標(biāo)。
查詢使用database.query()來(lái)進(jìn)行查詢得到一個(gè)Cursor類(lèi)型的數(shù)據(jù),其中query有7個(gè)參數(shù),依次分別為:
table(字符串類(lèi)型,表名),
columns(字符數(shù)組類(lèi)型,列名,為null時(shí)則查詢?nèi)?,
selection(相當(dāng)于where語(yǔ)句,查詢的條件,字符串類(lèi)型,如name=?)
selectionArg(條件查詢中占位符的值,字符串?dāng)?shù)組類(lèi)型),
groupby(分組字段,String類(lèi)型),
having(分組后的條件,字符串類(lèi)型),
orderBy(排序字段,字符串類(lèi)型)。
得到Cursor數(shù)據(jù)類(lèi)型之后,可以對(duì)Cursor數(shù)據(jù)進(jìn)行處理??梢耘袛郼ursor是否有下一個(gè)數(shù)據(jù),然后用moveToNext()移動(dòng)到下一個(gè)游標(biāo)等。而將cursor數(shù)據(jù)解析成自己想要的數(shù)據(jù)則通過(guò):
cursor.getString/Int...(cursor.getColumnIndex(字段名))來(lái)獲取。為了代碼重用,可以將建立一個(gè)wrapper類(lèi)extends? CursorWrapper,在其中實(shí)現(xiàn)getColumnIndex()等。
SQL方法:
SQL方法得到的也是一個(gè)Cursor數(shù)據(jù),但感覺(jué)比原生的Android方法要簡(jiǎn)單,所以我個(gè)人反而是比較推薦這個(gè)方法,如下:
Cursor cursor = database.rawQuery("select * from Book where name = ?",new String[]{value});
