- 2016年12月8日,Google中國(guó)開(kāi)發(fā)者大會(huì)在京舉行,同時(shí)正式上線了Google中國(guó)開(kāi)發(fā)者網(wǎng)站Google Developers,查看官方學(xué)習(xí)資源再也不用爬梯子了
SQLite數(shù)據(jù)庫(kù)的特點(diǎn)
SQLite,是一款輕量型的數(shù)據(jù)庫(kù),是遵守ACID(原子性、一致性、隔離性、持久性)的關(guān)聯(lián)式數(shù)據(jù)庫(kù)管理系統(tǒng),多用于嵌入式開(kāi)發(fā)中。
Android平臺(tái)中嵌入了一個(gè)關(guān)系型數(shù)據(jù)庫(kù)SQLite,和其他數(shù)據(jù)庫(kù)不同的是SQLite存儲(chǔ)數(shù)據(jù)時(shí)不區(qū)分類型,例如一個(gè)字段聲明為Integer類型,我們也可以將一個(gè)字符串存入,一個(gè)字段聲明為布爾型,我們也可以存入浮點(diǎn)數(shù)。
除非是主鍵被定義為Integer,這時(shí)只能存儲(chǔ)64位整數(shù),SQLite,無(wú)需安裝,是Android平臺(tái)自帶的一個(gè)數(shù)據(jù)庫(kù)。
-
創(chuàng)建數(shù)據(jù)庫(kù)的表時(shí)可以不指定數(shù)據(jù)類型,例如:
CREATE TABLE person(id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20)) -
SQLite支持大部分標(biāo)準(zhǔn)SQL語(yǔ)句,增刪改查語(yǔ)句都是通用的,分頁(yè)查詢語(yǔ)句和MySQL相同
SELECT * FROM person LIMIT 20 OFFSET 10 SELECT * FROM person LIMIT 10,20 SQLite與MySql的不同之處
主鍵自增長(zhǎng):SQLite是autoincrement,MySql是auto_increment
主鍵:SQLite主鍵一般定義為_(kāi)id,在做查詢時(shí)要求主鍵列名必須是_id(本身不是_id,可以起別名),不然拿不到主鍵值。獲取可讀數(shù)據(jù)庫(kù)、可寫(xiě)數(shù)據(jù)庫(kù)的區(qū)別
可讀的數(shù)據(jù)庫(kù)也有可能可以寫(xiě),可讀的數(shù)據(jù)庫(kù)在獲取實(shí)例時(shí)有可能拿到上一次可寫(xiě)的數(shù)據(jù)庫(kù)
創(chuàng)建數(shù)據(jù)庫(kù)
- 定義類繼承SQLiteOpenHelper
- 聲明構(gòu)造函數(shù),4個(gè)參數(shù)
- 重寫(xiě)onCreate()方法
- 重寫(xiě)upGrade()方法
public class PersonOpenHelper extends SQLiteOpenHelper {
public PersonOpenHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
}
public void onCreate(SQLiteDatabase db) {
// 數(shù)據(jù)庫(kù)第一次被創(chuàng)建的時(shí)候執(zhí)行如下sql語(yǔ)句創(chuàng)建一個(gè)person表
db.execSQL("create table person(id integer primary key autoincrement, name varchar(20), phone varchar(20), money integer(20),age integer(10));");
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 數(shù)據(jù)庫(kù)的版本更新的時(shí)候執(zhí)行
if (oldVersion == 1 && newVersion == 2) {
db.execSQL("alter table person add column balance integer");
}
}
}
創(chuàng)建一個(gè)PersonOpenHelper類來(lái)測(cè)試上面的代碼
public class PersonOpenHelperTest extends AndroidTestCase {
public SQLiteDatabase getDataBase(){
PersonOpenHelper helper = new PersonOpenHelper(getContext(), "person.db", null, 1);
SQLiteDatabase writableDatabase = helper.getWritableDatabase();
return writableDatabase;
}
}
執(zhí)行完上面代碼后,通過(guò)DDMS,查看/data/data/com.包名.sqlite/databases目錄,發(fā)現(xiàn)產(chǎn)生了兩個(gè)文件,person.db和person.db-journal。其中第一個(gè)文件就是我們的數(shù)據(jù)庫(kù)文件。
第一次操作數(shù)據(jù)庫(kù)時(shí),person.db-journal文件會(huì)被自動(dòng)創(chuàng)建,該文件是sqlite的一個(gè)臨時(shí)的日志文件,主要用于sqlite數(shù)據(jù)庫(kù)的事務(wù)回滾操作了。 但是Android系統(tǒng)中將該文件永久的保存在磁盤(pán)中,不會(huì)被自動(dòng)清除的,如果沒(méi)有操作異?;蛘卟恍枰聞?wù)回滾時(shí),此文件的大小為0。這種機(jī)制避免了每次生成和刪除person.db-journal文件的開(kāi)銷。
在測(cè)試類中創(chuàng)建該類對(duì)象,調(diào)用getWritableDatabase()或者getReadableDatabase():如果數(shù)據(jù)庫(kù)不存在,創(chuàng)建數(shù)據(jù)庫(kù)文件,執(zhí)行onCreate()方法,并獲取數(shù)據(jù)庫(kù)對(duì)象。如果數(shù)據(jù)庫(kù)存在,版本號(hào)沒(méi)有發(fā)生改變,直接獲取數(shù)據(jù)庫(kù)對(duì)象。如果數(shù)據(jù)庫(kù)存在,版本號(hào)提升,先執(zhí)行onUpgrade()方法,再獲取數(shù)據(jù)庫(kù)對(duì)象。
數(shù)據(jù)庫(kù)并不是初始化MyHelper時(shí)創(chuàng)建。如果版本號(hào)降低,應(yīng)用降級(jí)。并且不重寫(xiě)onDowngrade,就會(huì)調(diào)用父類的onDowngrade方法,拋出異常。一般不重寫(xiě),沒(méi)這個(gè)需求。
SQLiteDataBase自帶的增刪改查
SQLiteDatabase專門(mén)提供了對(duì)應(yīng)于添加(insert)、刪除(delete)、更新(update)、查詢(query)的操作方法。
這些方法封裝了部分SQL語(yǔ)句,通過(guò)參數(shù)進(jìn)行拼接,這些方法實(shí)際上是給那些不太了解SQL語(yǔ)法的開(kāi)發(fā)者使用的。對(duì)于熟悉SQL語(yǔ)法的程序員而言,直接使用execSQL()和rawQuery()方法執(zhí)行SQL語(yǔ)句就能完成數(shù)據(jù)的添加、刪除、更新、查詢操作。
這四個(gè)方法主要是在使用內(nèi)容提供者時(shí)使用,因?yàn)镃ontentProvider中提供的增刪改查方法,與這一套一樣,方便調(diào)用傳參。(等學(xué)完ContentProvider自然明白)
- insert("表名",nullColumnHack,"",contentValue)
1. nullColumnHack:如果寫(xiě)null,就無(wú)法插入一條空數(shù)據(jù)(2.3會(huì)出異常,4.0之后可以寫(xiě)null)
2. 如果想插入空數(shù)據(jù),第二個(gè)參數(shù)必須寫(xiě)一個(gè)列名(任意列)
3. 這個(gè)列名是用來(lái)拼接sql語(yǔ)句的,如果contentValue為空,則后臺(tái)不知道表的列名,無(wú)法構(gòu)建sql語(yǔ)句
4. ContentValue:鍵值對(duì):鍵對(duì)應(yīng)列明,值對(duì)應(yīng)插入的值
5. 返回值 long id,插入的主鍵id
- delete("表名",條件,條件值),返回受影響的行數(shù)。
- update("表名",contentValues(更新列、值),條件,條件值),返回受影響的行數(shù)
- query("表名", 查詢的字段, 條件, 條件值);