Android-使用嵌入式SQLite
Android平臺(tái)上集成的一個(gè)嵌入式關(guān)系型數(shù)據(jù)庫,SQLite3支持?NULL,INTEGER,REAL(浮點(diǎn)數(shù)
字),TEXT(字符串文本)和BLOB(二進(jìn)制對(duì)象)數(shù)據(jù)類型,雖然它支持的類型只有五種,但實(shí)際上
sqlite3也接受varchar(n),char(n),decimal(p,s)?等數(shù)據(jù)類型,只不過在運(yùn)算或保存時(shí)會(huì)轉(zhuǎn)
成對(duì)應(yīng)的五種數(shù)據(jù)類型.
SQLite最大的特點(diǎn)是你可以把各種類型的數(shù)據(jù)保存到任何字段中,而不用關(guān)心字段聲明的數(shù)據(jù)類型是
什么.?但定義為INTEGER?PRIMARY?KEY的字段只能存儲(chǔ)64位整數(shù),?當(dāng)向這種字段保存除整數(shù)以外
的數(shù)據(jù)時(shí),將會(huì)產(chǎn)生錯(cuò)誤.
另外,?SQLite在解析CREATE?TABLE語句時(shí),會(huì)忽略字段名后面的數(shù)據(jù)類型信息.
SQLite可以解析大部分標(biāo)準(zhǔn)SQL語句,如:
查詢語句:select?*?from?..?where?group?by?..having?...?order?by?排序子句
SQLite分頁同mysql相同:
...?limit?5?offset?3?|?limit?3,5
首次使用數(shù)據(jù)庫需要?jiǎng)?chuàng)建表及初始化一些信息,升級(jí)時(shí)需要修改表信息,android提供了SQLiteOpenHelper完成此類功能
onCreate(SQLiteDatabase?db)方法用于首次使用時(shí)創(chuàng)建庫,onUpgrade(SQLiteDatabase?db,int?oldVersion,int?newVersion)方法檢測版本變化時(shí)更新庫
getWriteableDatabase()和getReadableDatabase()方法獲取一個(gè)用于操作數(shù)據(jù)庫的SQLiteDatabase實(shí)例。
getWriteableDatabase()方法一讀寫方式打開數(shù)據(jù)庫,一旦數(shù)據(jù)庫的磁盤空間滿了,數(shù)據(jù)庫只能讀而不能寫。倘若使用getWriteableDatabase()打開數(shù)據(jù)庫就會(huì)出錯(cuò)。getReadableDatabase()方法以讀方式打開數(shù)據(jù)庫。
public?class?DatabaseHelper?extends?SQLiteOpenHelper?{
private?static?final?String?name?=?"itcast";//數(shù)據(jù)庫名稱
private?static?final?int?version?=?1;??????//數(shù)據(jù)庫版本
public?DatabaseHelper(Context?context){
Super(context,name,null,version);
}
public?void?onCreate(){
//drop?table?if?exists?customers
//create?table?if?not?exists?customers(...
db.execSQL("CREATE?TABLE?IF?NOT?EXISTS?person?(personid?integer? primary???????????????????????????key?autoincrement,?name?varchar(20),?age?INTEGER)");
}
public?void?onUpgrade(SQLiteDatabase?db,int?oldVersion,intnewVersion){
db.execSQL("??ALTER?TABLE?person?ADD?phone?VARCHAR(12)??NULL");
}
}
在實(shí)際項(xiàng)目開發(fā)中,當(dāng)數(shù)據(jù)庫表結(jié)構(gòu)發(fā)生更新時(shí),應(yīng)該避免用戶存放于數(shù)據(jù)庫中的數(shù)據(jù)丟失。
使用SQLiteDataBase數(shù)據(jù)庫
SQLiteDatabase?db?=?....;
db.execSQL("insert?into?person(name,age)?values(?,?)",new?Object[]{..});
db.close();
//查詢操作
Cursor?cursor?=?db.rawQuery("select?*?from?person",?null);
while(cursor.moveToNext){
int?personid?=?cursor.getInt(0);
String?name?=?cursor.getString(1);
int?age?=?cursor.getInt(2);
cursor.close();
Db.close();
}
cursor.close();
db.close();
SQLiteDatabase?db?=?databaseHelper.getWritableDatabase();
ContentValues?values?=?new?ContentValues();
Values.put("name","傳智播客");
.....
Long?rowid?=?db.insert("person",null,values);
//刪除
SQLiteDatabase?db?=?databaseHelper.getWritableDatabase();
db.delete("person","personid<?",new?String[]{"2"}">");
db.close();
//更新
SQLiteDatabase?db?=?databaseHelper.getWritableDatabase();
ContentValues?values?=?new?ContentValues();
//key為字段名,value為值
values.put("name","傳智播客");
db.update("person",values,"personid=?",new?String[]{"1"});
db.close();
注:第一次調(diào)用getWritableDatabase()或getReadableDatabase()方法后,SQLiteOpenHelper
會(huì)緩存當(dāng)前的SQLiteDatabase實(shí)例,SQLiteDatabase實(shí)例正常情況下會(huì)維持?jǐn)?shù)據(jù)庫的打開狀態(tài),所以在你不需要SQLiteDatabase實(shí)例時(shí),請(qǐng)及時(shí)調(diào)用close()方法釋放資源,一旦SQLiteDatabase實(shí)例被緩存,多次調(diào)用getWritableDatabase()或getReadableDatabase()方法得到的都是同一實(shí)例。
事務(wù)處理:
SQLiteDatabase?db?=?...;
db.beginTransaction();
Try{
db.execSQL(...)
db.execSQL(...);
//設(shè)置成功標(biāo)記
db.setTransactionSuccessful();
}catch(){
....
}?finally?{
db.endTransaction();//由事務(wù)的標(biāo)志決定是提交事務(wù),還是回滾事務(wù)。
}
db.close();
注意:創(chuàng)建表時(shí),只能用integer類型,不能用int作為主鍵,否則不支持autoincrement.
create?table?customers(id?integer?primary?key?autoincrement,name?text);
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Android-使用嵌入式SQLite的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 土豪金是什么色号(土豪金cmyk值是多少
- 下一篇: 蒙氏教育课程启示(蒙氏教育课程)