- 工具:Android Studio躁锡,XMind煤伟,馬克飛象瞭吃,印象筆記
- 2016年12月8日,Google中國開發(fā)者大會在京舉行杜跷,同時正式上線了Google中國開發(fā)者網(wǎng)站Google Developers傍念,查看官方學(xué)習(xí)資源再也不用爬梯子了
SQLite數(shù)據(jù)庫的特點(diǎn)
SQLite,是一款輕量型的數(shù)據(jù)庫葛闷,是遵守ACID(原子性憋槐、一致性、隔離性淑趾、持久性)的關(guān)聯(lián)式數(shù)據(jù)庫管理系統(tǒng)秦陋,多用于嵌入式開發(fā)中。
Android平臺中嵌入了一個關(guān)系型數(shù)據(jù)庫SQLite治笨,和其他數(shù)據(jù)庫不同的是SQLite存儲數(shù)據(jù)時不區(qū)分類型,例如一個字段聲明為Integer類型赤嚼,我們也可以將一個字符串存入旷赖,一個字段聲明為布爾型,我們也可以存入浮點(diǎn)數(shù)更卒。
除非是主鍵被定義為Integer等孵,這時只能存儲64位整數(shù),SQLite蹂空,無需安裝俯萌,是Android平臺自帶的一個數(shù)據(jù)庫。
-
創(chuàng)建數(shù)據(jù)庫的表時可以不指定數(shù)據(jù)類型上枕,例如:
CREATE TABLE person(id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20))
-
SQLite支持大部分標(biāo)準(zhǔn)SQL語句咐熙,增刪改查語句都是通用的,分頁查詢語句和MySQL相同
SELECT * FROM person LIMIT 20 OFFSET 10 SELECT * FROM person LIMIT 10,20
SQLite與MySql的不同之處
主鍵自增長:SQLite是autoincrement辨萍,MySql是auto_increment
主鍵:SQLite主鍵一般定義為_id棋恼,在做查詢時要求主鍵列名必須是_id(本身不是_id,可以起別名)锈玉,不然拿不到主鍵值爪飘。獲取可讀數(shù)據(jù)庫、可寫數(shù)據(jù)庫的區(qū)別
可讀的數(shù)據(jù)庫也有可能可以寫拉背,可讀的數(shù)據(jù)庫在獲取實(shí)例時有可能拿到上一次可寫的數(shù)據(jù)庫
創(chuàng)建數(shù)據(jù)庫
- 定義類繼承SQLiteOpenHelper
- 聲明構(gòu)造函數(shù)师崎,4個參數(shù)
- 重寫onCreate()方法
- 重寫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ù)庫第一次被創(chuàng)建的時候執(zhí)行如下sql語句創(chuàng)建一個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ù)庫的版本更新的時候執(zhí)行
if (oldVersion == 1 && newVersion == 2) {
db.execSQL("alter table person add column balance integer");
}
}
}
創(chuàng)建一個PersonOpenHelper類來測試上面的代碼
public class PersonOpenHelperTest extends AndroidTestCase {
public SQLiteDatabase getDataBase(){
PersonOpenHelper helper = new PersonOpenHelper(getContext(), "person.db", null, 1);
SQLiteDatabase writableDatabase = helper.getWritableDatabase();
return writableDatabase;
}
}
執(zhí)行完上面代碼后,通過DDMS椅棺,查看/data/data/com.包名.sqlite/databases目錄犁罩,發(fā)現(xiàn)產(chǎn)生了兩個文件齐蔽,person.db和person.db-journal。其中第一個文件就是我們的數(shù)據(jù)庫文件昼汗。
第一次操作數(shù)據(jù)庫時肴熏,person.db-journal文件會被自動創(chuàng)建,該文件是sqlite的一個臨時的日志文件顷窒,主要用于sqlite數(shù)據(jù)庫的事務(wù)回滾操作了蛙吏。 但是Android系統(tǒng)中將該文件永久的保存在磁盤中,不會被自動清除的鞋吉,如果沒有操作異逞蛔觯或者不需要事務(wù)回滾時,此文件的大小為0谓着。這種機(jī)制避免了每次生成和刪除person.db-journal文件的開銷泼诱。
在測試類中創(chuàng)建該類對象,調(diào)用getWritableDatabase()或者getReadableDatabase():如果數(shù)據(jù)庫不存在赊锚,創(chuàng)建數(shù)據(jù)庫文件治筒,執(zhí)行onCreate()方法,并獲取數(shù)據(jù)庫對象舷蒲。如果數(shù)據(jù)庫存在耸袜,版本號沒有發(fā)生改變盏求,直接獲取數(shù)據(jù)庫對象秉馏。如果數(shù)據(jù)庫存在,版本號提升靡挥,先執(zhí)行onUpgrade()方法纵柿,再獲取數(shù)據(jù)庫對象蜈抓。
數(shù)據(jù)庫并不是初始化MyHelper時創(chuàng)建。如果版本號降低昂儒,應(yīng)用降級沟使。并且不重寫onDowngrade,就會調(diào)用父類的onDowngrade方法渊跋,拋出異常格带。一般不重寫,沒這個需求刹枉。
SQLiteDataBase自帶的增刪改查
SQLiteDatabase專門提供了對應(yīng)于添加(insert)叽唱、刪除(delete)、更新(update)微宝、查詢(query)的操作方法棺亭。
這些方法封裝了部分SQL語句,通過參數(shù)進(jìn)行拼接蟋软,這些方法實(shí)際上是給那些不太了解SQL語法的開發(fā)者使用的镶摘。對于熟悉SQL語法的程序員而言嗽桩,直接使用execSQL()和rawQuery()方法執(zhí)行SQL語句就能完成數(shù)據(jù)的添加、刪除凄敢、更新碌冶、查詢操作。
這四個方法主要是在使用內(nèi)容提供者時使用涝缝,因?yàn)镃ontentProvider中提供的增刪改查方法扑庞,與這一套一樣,方便調(diào)用傳參拒逮。(等學(xué)完ContentProvider自然明白)
- insert("表名",nullColumnHack,"",contentValue)
1. nullColumnHack:如果寫null罐氨,就無法插入一條空數(shù)據(jù)(2.3會出異常,4.0之后可以寫null)
2. 如果想插入空數(shù)據(jù)滩援,第二個參數(shù)必須寫一個列名(任意列)
3. 這個列名是用來拼接sql語句的,如果contentValue為空玩徊,則后臺不知道表的列名租悄,無法構(gòu)建sql語句
4. ContentValue:鍵值對:鍵對應(yīng)列明,值對應(yīng)插入的值
5. 返回值 long id恩袱,插入的主鍵id
- delete("表名",條件,條件值)憎蛤,返回受影響的行數(shù)。
- update("表名",contentValues(更新列、值),條件冰肴,條件值),返回受影響的行數(shù)
- query("表名", 查詢的字段, 條件, 條件值);