sqlite是一款開源的、嵌入式關系型數據庫,第一個版本alpha發布于2000年。sqlite在便攜性、易用性、緊湊性、高效性和可靠性方面有著突出的表現。
在android中創建的sqlite數據庫存儲在:/data/data/<包名>/databases/目錄下。
主要特點:
-輕量級
-獨立性,沒有不依賴,無需安裝
-跨平臺,支持眾多操作系統
-支持高達2tb大小的數據庫
-每個數據庫以單個文件的形式存在
-以b-tree的數據結構形式存儲在硬盤
sqlite的數據類型:
sqlite支持null、integer、real、text和blob數據類型
分別代表:空值、整型值、浮點值、字符串值、二進制對象。
動態數據類型(弱引用):
當某個值插入到數據庫中時,sqlite將會檢測它的數據類型,如果該類型與關聯的列不匹配,sqlite則會嘗試將該值轉換成該列的類型,如果不能轉換,則該值將作為本身的類型存儲。
在android中使用sqlite主要涉及兩個類:
sqlitedatabase和sqliteopenhelper,下面對這兩個類進行主要的分析。
sqlitedatabase
這個類提供了一些管理sqlite數據庫的方法,比如創建、刪除、執行sql命令,和執行其他常見的數據庫管理任務的方法。每個程序的數據庫名字是唯一的。
常用方法:
db.execsql(string sql) //執行任何的sql語句
db.insert(string table,string nullcolumnhack,contentvalues values) //插入記錄
db.delete(string table,string whereclause,string[] whereargs)//刪除記錄
db.update(string table,contentvalues values,string whereclause,string[] whereargs)//更新記錄
db.query(string table,string[] columns,string selection,string[] selectionargs,string groupby,string having,string orderby)//查詢記錄
db.rawquery(string sql,string[] selectionargs)//通過sql語句查詢記錄
下面是一個簡單操作sqlite數據庫的示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
public class mainactivity extends appcompatactivity { @override protected void oncreate(bundle savedinstancestate) { super .oncreate(savedinstancestate); setcontentview(r.layout.activity_main); //每個程序都有自己的數據庫 //通過openorcreatedatabase來打開或創建一個數據庫,返回sqlitedatabase對象 /** * openorcreatedatabase(string name,int mode,sqlitedatabase.cursorfactory factory) * name: 數據庫名 * mode: 數據庫權限,mode_private為本應用程序私有,mode_world_readable和mode_world_writeable分別為全局可讀和可寫。 * factory: 可以用來實例化一個cusor對象的工廠類 */ sqlitedatabase db = openorcreatedatabase( "user.db" ,mode_private, null ); //創建一個表 db.execsql( "create table if not exists usertb (" + "_id integer primary key," + "name text not null,age integer not null," + "sex text not null)" ); //向表中插入記錄 db.execsql( "insert into usertb (name,age,sex) values ('張三',18,'女')" ); db.execsql( "insert into usertb (name,age,sex) values ('李四',19,'男')" ); db.execsql( "insert into usertb (name,age,sex) values ('王五',20,'女')" ); //cursor為查詢結果對象,類似于jdbc中的resultset cursor queryresult = db.rawquery( "select * from usertb" , null ); if (queryresult != null ) { while (queryresult.movetonext()) { log.i( "info" , "id: " + queryresult.getint(queryresult.getcolumnindex( "_id" )) + " 姓名: " + queryresult.getstring(queryresult.getcolumnindex( "name" )) + " 年齡: " + queryresult.getint(queryresult.getcolumnindex( "age" )) + " 性別: " + queryresult.getstring(queryresult.getcolumnindex( "sex" ))); } //關閉游標對象 queryresult.close(); } //關閉數據庫 db.close(); } } |
當執行完openorcreatedatabase("user.db",mode_private,null)后,會在/data/data/<包名>/databases/目錄下創建一個數據庫文件,打開ddms可以查看。也可以將其導出,使用navigate等工具打開查看里面的數據。
另外,上述示例對記錄的操作是使用execsql()方法通過原生的sql語句進行的,當然也可以使用上面介紹的sqlitedatabase常用的方法來操作,如insert()、delete()、update()、query()等方法。但是需要注意的是,以插入記錄舉例,當數據量不大時,通過execsql()使用sql語句進行插入與使用insert()方法插入記錄的效率是差不多的,但是如果數據量比較大,那么使用前者比使用后者的效率明顯高出很多。
sqliteopenhelper
這個類為sqlitedatabase的幫助類,主要用于管理數據庫的創建與版本更新。sqlitehelper是一個抽象類,一般通過創建一個繼承自它的子類并重寫oncreat()和onupgrade()方法進行使用。
-oncreat(sqlitedatabase db) //首次創建數據庫時調用,一般用于建表等操作。
-onupgrade(sqlitedatabase db,int oldversion,int newversion)//當升級數據庫版本時調用
下面是使用sqliteopenhelper的一個簡單示例:
創建一個繼承自sqliteopenhelper的子類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public class sqlitehelper extends sqliteopenhelper { /** * context:上下文對象 * name:數據庫名 */ public sqlitehelper(context context, string name) { super (context, name, null , 1 ); } //首次創建數據庫的時候調用,一般進行建表或某些初始化的操作 @override public void oncreate(sqlitedatabase db) { //建表 db.execsql( "create table if not exists usertb (" + "_id integer primary key," + "name text not null,age integer not null," + "sex text not null)" ); } //當數據庫版本升級時自動調用 @override public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { } } |
然后就可以通過sqlitehelper的實例獲取一個sqlitedatabase對象,進而對數據庫進行一系列的操作了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
public class mainactivity2 extends appcompatactivity { @override protected void oncreate(bundle savedinstancestate) { super .oncreate(savedinstancestate); setcontentview(r.layout.activity_main2); //創建一個sqlitehelper對象 sqlitehelper helper = new sqlitehelper(mainactivity2. this , "stu.db" ); //使用getwritabledatabase()或getreadabledatabase()方法獲得sqlitedatabase對象 sqlitedatabase db = helper.getwritabledatabase(); //插入記錄 db.execsql( "insert into usertb (name,age,sex) values ('張三',18,'女')" ); db.execsql( "insert into usertb (name,age,sex) values ('李四',19,'男')" ); db.execsql( "insert into usertb (name,age,sex) values ('王五',20,'女')" ); //獲取游標對象 cursor queryresult = db.rawquery( "select * from usertb" , null ); if (queryresult != null ) { //打印所有記錄 while (queryresult.movetonext()) { log.i( "info" , "id: " + queryresult.getint(queryresult.getcolumnindex( "_id" )) + " 姓名: " + queryresult.getstring(queryresult.getcolumnindex( "name" )) + " 年齡: " + queryresult.getint(queryresult.getcolumnindex( "age" )) + " 性別: " + queryresult.getstring(queryresult.getcolumnindex( "sex" ))); } //關閉游標對象 queryresult.close(); } //關閉數據庫 db.close(); } } |