SQLite是Android內(nèi)嵌的一個數(shù)據(jù)庫全蝶,用于存儲大量的數(shù)據(jù)裂垦,其特點是輕量級限番,占用內(nèi)存很少,不需要安裝胰默,多有的數(shù)據(jù)都包含在一個文件中,多個平臺只需拷貝數(shù)據(jù)庫文件就可直接使用漓踢,默認只能本應(yīng)用訪問初坠,app卸載時會一同被卸載。
存儲路徑:/data/data/包名/databases/xx.db
SQLite管理工具:可視化的數(shù)據(jù)庫管理工具彭雾,推薦SQLite Expert Professional,
? ?下載地址:http://www.sqliteexpert.com
主鍵:_id integer primary key autoincrement ?表示設(shè)置_id為主鍵并自增
數(shù)據(jù)庫類型
NULL: 這個值為空值
VARCHAR(n):長度不固定且其最大長度為 n 的字串碟刺,n不能超過 4000。
CHAR(n):長度固定為n的字串薯酝,n不能超過 254半沽。
INTEGER: 值被標識為整數(shù),依據(jù)值的大小可以依次被存儲為1,2,3,4,5,6,7,8.
REAL: 所有值都是浮動的數(shù)值,被存儲為8字節(jié)的IEEE浮動標記序號.
TEXT: 值為文本字符串,使用數(shù)據(jù)庫編碼存儲(TUTF-8, UTF-16BE or UTF-16-LE).
BLOB: 值是BLOB數(shù)據(jù)塊,以輸入的數(shù)據(jù)格式進行存儲吴菠。如何輸入就如何存儲,不改??變格式者填。
BINARY:用于保存圖片,對應(yīng)字節(jié)數(shù)組byte[]
DATA :包含了 年份做葵、月份占哟、日期。
TIME: 包含了 小時酿矢、分鐘榨乎、秒
SQLiteDatabase
SQLiteDatabase代表一個數(shù)據(jù)庫對象,數(shù)據(jù)庫的核心類之一瘫筐,針對數(shù)據(jù)操作的主要類蜜暑,主要對數(shù)據(jù)庫的表的創(chuàng)建,增刪改查等動作策肝,其方法:
SQLiteDatabase除了本身的insert肛捍,update,delete等操作語句之众,還有兩個同樣可以進行數(shù)據(jù)的操作拙毫。
executeSQL(String sql, Object[] bindArgs);// 執(zhí)行語句的增刪改,并不是用于查詢
rawQuery(String sql, String[] selectionArgs);查詢語句棺禾,返回Cursor對象
常用增刪改查語句
創(chuàng)建表:db.execSQL("create table wdply(_id integer primary key autoincrement,name varchar ,age int,sex varchat,tel varchar)");
增:db.execSQL("insert into wdply values(null,?,?,?,?)", newObject[]{"小明",1,"男","159"});
刪:db.execSQL("delete from wdply where name=?", newObject[]{"小明"});
改:db.execSQL("update wdply set sex=? where name=?", newObject[]{"女","小明"});
查:Cursor cursor = db.rawQuery("select * from wdply", null);
Cursor對象
查詢語句時缀蹄,返回cursor對象,用于讀取查詢到的數(shù)據(jù),cursor對象常用的方法:
SQLiteOpenHelper
是抽象類袍患,子類必須繼承SQLiteOpenHelper坦康,并實現(xiàn)其連個抽象方法:
onUpgrade(SQLiteDatabasedb, int oldVersion, int newVersion)
SQLiteDatabase會自動檢測數(shù)據(jù)庫文件是否存在,如果數(shù)據(jù)庫存在诡延,會打開這個數(shù)據(jù)庫滞欠,在這種情況下并不會執(zhí)行onCreate()方法,如果數(shù)據(jù)庫文件不存在肆良,則會創(chuàng)建一個數(shù)據(jù)庫筛璧,并打開這個數(shù)據(jù)庫,最后執(zhí)行onCreate方法惹恃,因此夭谤,onCreate方法一般用來在新創(chuàng)建的數(shù)據(jù)庫中建立表,視圖等數(shù)據(jù)庫組件巫糙,也就是說onCreate方法在數(shù)據(jù)庫第一次創(chuàng)建的時候調(diào)用朗儒。
數(shù)據(jù)庫創(chuàng)建會有一個初始化版本為1,數(shù)據(jù)庫升級時需增大這個版本號参淹,這是SQLiteDatabase會調(diào)用OnUpgrade方法醉锄,調(diào)用完后系統(tǒng)會更新數(shù)據(jù)庫版本號,因此在OnUpdate方法中一般先刪除要升級的表浙值,視圖等恳不,然后在創(chuàng)建他們。
總結(jié):如果數(shù)據(jù)庫文件不存在开呐,只有onCreate方法被調(diào)用烟勋,(該方法只會被調(diào)用一次),如果數(shù)據(jù)庫文件存在筐付,并且當(dāng)前版本較高卵惦,執(zhí)行onUpgrade方法更新數(shù)據(jù)庫,并更新版本號家妆。
SQLiteOpenHelper的getReadableDatabase() 和 getWritableDatabase()區(qū)別
Android使用getWritableDatabase()和getReadableDatabase()方法都可以獲取一個用于操作數(shù)據(jù)庫的SQLiteDatabase實例鸵荠。(getReadableDatabase()方法中會調(diào)用getWritableDatabase()方法)
其中g(shù)etWritableDatabase()方法以讀寫方式打開數(shù)據(jù)庫,一旦數(shù)據(jù)庫的磁盤空間滿了伤极,數(shù)據(jù)庫就只能讀而不能寫,倘若使用的是getWritableDatabase()方法就會出錯姨伤。
getReadableDatabase()方法則是先以讀寫方式打開數(shù)據(jù)庫哨坪,如果數(shù)據(jù)庫的磁盤空間滿了,就會打開失敗乍楚,當(dāng)打開失敗后會繼續(xù)嘗試以只讀方式打開數(shù)據(jù)庫当编。如果該問題成功解決,則只讀數(shù)據(jù)庫對象就會關(guān)閉徒溪,然后返回一個可讀寫的數(shù)據(jù)庫對象