前言html
對於Android平臺來講,系統內置了豐富的API來供開發人員操做SQLite,咱們能夠輕鬆的完成對數據的存取。下面就向你們介紹一下SQLite經常使用的操做方法。本篇文章主要用到SQLiteDatabase的一些函數。廢話少說,直接貼代碼!因爲數據庫中操做的對象時Student類,所以咱們看一下Student.java代碼:java
從Student類的定義能夠看出,它有5個成員變量,其中第一個成員變量是其‘主鍵’,這個名稱與數據庫中表的主鍵要徹底一致。android
下面咱們看一下MainActivity.java代碼:git
咱們一點點的看吧。web
1. 佈局:這個Activity和通常的Activity沒有太大的區別,它有7個按鈕控件和一個ListView控件(詳細布局見見面的佈局文件)。BtnInit()函數是將控件與佈局文件相關聯,而且設置相應的點擊事件處理。每個點擊分別對應一個函數。sql
2. 數據庫的創建與打開:OpenCreateDB()函數完成。咱們聲明一個成員變量SQLiteDatabasedb;經過執行系統的API函數openOrCreateDatabase打開或新建一個數據庫。經過執行db的execSQL函數執行建立表的一個SQL語句來建立students表。執行完以後,會在系統的/data/data/[PACKAGE_NAME]/databases目錄下出現數據庫文件數據庫
[圖1]網絡
此時,至關於有一張students的空表:數據結構
studentsapp
_id[INTEGER] |
name[VARCHAR] |
grade[INTEGER] |
age[INTEGER] |
info[VARCHAR] |
|
|
|
|
|
3. 插入操做:插入操做由函數InsertData()函數完成。咱們用了三種方式插入數據。
(a)publicvoid execSQL (Stringsql)
(b)publicvoid execSQL (Stringsql,Object[]bindArgs)
(c)ContentValues與insert函數相結合的方式
執行完以後,咱們能夠經過點擊‘顯示當前數據庫’按鈕,來查看當前數據庫中的信息。
_id[INTEGER] |
name[VARCHAR] |
grade[INTEGER] |
age[INTEGER] |
info[VARCHAR] |
1 |
張三 |
98 |
21 |
南京郵電大學電子信息工程 |
2 |
李四 |
87 |
22 |
南京郵電大學通訊工程 |
3 |
王五 |
99 |
19 |
南京郵電大學網絡工程 |
4 |
李華 |
78 |
23 |
南京郵電大學軟件工程 |
4. 更新操做:UpdateAge()和UpdateGrade()兩個函數完成。體現了更新數據兩種方式:
(a) publicvoid execSQL (Stringsql)
(b) ContentValues與update函數相結合的方式
publicint update(Stringtable,ContentValuesvalues,StringwhereClause,String[]whereArgs)
(c) 固然,咱們也能夠用publicvoid execSQL (Stringsql,Object[]bindArgs)函數,將參數先用’?’代替,而後再bindArgs中賦值。
5. 刪除操做:由Delete函數完成。刪除操做能夠直接用execSQL執行SQL語言。固然,也能夠用publicint delete (Stringtable,StringwhereClause,String[]whereArgs)函數,和更新同樣,也有三種調用方式,在此否則贅述。
6. 查詢操做:由函數Select()函數完成。查詢操做時最複雜的操做。須要rawQuery函數,還有遊標Cursor類的使用。首先,咱們將咱們的查找需求寫成SQL語言,而後執行數據庫的rawQuery函數,返回的是一個Cursor類型的對象。這個對象指向查詢結果集第一行。咱們能夠經過調用Cursor的moveToNext函數對查詢到的結果集進行遍歷。
查詢的函數還有:
db.rawQuery(String sql, String[] selectionArgs);
db.query(String table, String[] columns, String selection,String[] selectionArgs, String groupBy, String having, String orderBy);
db.query(String table, String[] columns, String selection,String[] selectionArgs, String groupBy, String having, String orderBy, Stringlimit);
db.query(String distinct, String table, String[] columns, Stringselection, String[] selectionArgs, String groupBy, String having, StringorderBy, String limit);
經常使用的Cursor的方法以下:
c.move(int offset); //以當前位置爲參考,移動到指定行
c.moveToFirst(); //移動到第一行
c.moveToLast(); //移動到最後一行
c.moveToPosition(intposition); //移動到指定行
c.moveToPrevious(); //移動到前一行
c.moveToNext(); //移動到下一行
c.isFirst(); //是否指向第一條
c.isLast(); //是否指向最後一條
c.isBeforeFirst(); //是否指向第一條以前
c.isAfterLast(); //是否指向最後一條以後
c.isNull(intcolumnIndex); //指定列是否爲空(列基數爲0)
c.isClosed(); //遊標是否已關閉
c.getCount(); //總數據項數
c.getPosition(); //返回當前遊標所指向的行數
c.getColumnIndex(StringcolumnName);//返回某列名對應的列索引值
c.getString(intcolumnIndex); //返回當前行指定列的值
7.顯示操做:Display函數完成。咱們首先得到表中第一列的Cursor對象,而後逐步遍歷便可。咱們能夠經過以下語句得到:
Cursor c = db.rawQuery("SELECT * FROM students",null);
總結:完成數據庫的操做,大多數狀況下咱們均可以用execSQL函數來執行SQL語言便可。附錄中列舉了常見的簡單SQL語言的操做。
程序運行界面:
[圖2]
佈局文件爲:
整個項目的源代碼:http://download.csdn.net/detail/nuptboyzhb/4515791
參考:
1.http://blog.csdn.net/liuhe688/article/details/6715983
2. http://www.cnblogs.com/rockdean/articles/2425843.html
附錄:
SQLite3支持的數據類型
通常數據採用的固定的靜態數據類型,而SQLite採用的是動態數據類型,會根據存入值自動判斷。SQLite具備如下五種數據類型:
1.NULL:空值。
2.INTEGER:帶符號的整型,具體取決有存入數字的範圍大小。
3.REAL:浮點數字,存儲爲8-byte IEEE浮點數。
4.TEXT:字符串文本。
5.BLOB:二進制對象。
但實際上,sqlite3也接受以下的數據類型:
smallint 16 位元的整數。
interger 32 位元的整數。
decimal(p,s) p 精確值和 s 大小的十進位整數,精確值p是指所有有幾個數(digits)大小值,s是指小數點後有幾位數。若是沒有特別指定,則系統會設爲 p=5; s=0 。
float 32位元的實數。
double 64位元的實數。
char(n) n 長度的字串,n不能超過 254。
varchar(n) 長度不固定且其最大長度爲 n的字串,n不能超過 4000。
graphic(n) 和 char(n)同樣,不過其單位是兩個字元 double-bytes, n不能超過127。這個形態是爲了支援兩個字元長度的字體,例如中文字。
vargraphic(n)可變長度且其最大長度爲 n的雙字元字串,n不能超過 2000
date 包含了年份、月份、日期。
time 包含了小時、分鐘、秒。
timestamp 包含了年、月、日、時、分、秒、千分之一秒。
datetime 包含日期時間格式,必須寫成'2010-08-05'不能寫爲'2010-8-5',不然在讀取時會產生錯誤!
sql語言的基本語句
(一)表的創建
關係數據庫的主要特色之一就是用表的方式組織數據。表是SQL語言存放數據、查找數據以及更新數據的基本數據結構。在SQL語言中,表有嚴格的定義,它是一種二維表,對於這種表有以下規定:
1)每一張表都有一個名字,一般稱爲表名或關係名。表名必須以字母開頭,最大長度爲30個字符。
2)一張表能夠由若干列組成,列名惟一,列名也稱做屬性名。
3)表中的一行稱爲一個元組,它至關於一條記錄。
4)同一列的數據必須具備相同的數據類型。
5)表中的每個列值必須是不可分割的基本數據項。
注意:當用戶須要新的數據結構或表存放數據時,首先要生成一個表。
語法:
CREATE TABLE 表名 [表約束]
(列名1數據類型 [缺省值1,列約束1]
(列名2數據類型 [缺省值2,列約束2]
…
列名n 數據類型 [缺省值n,列約束n]
[TABLESPACE 表空間名稱]
[STORAGE (存貯的子句)]
[ENABLE 約束名]
[DISABLE 約束名]
(一)插入數據
當一個表新建成時,它裏面沒有數據,經過向表中扦入數據,建成表的實例。
語句句法:
INSERT INTO 表名[(列名1,…)]
VALUES(值1,值2,…,值n)
[子查詢];
假設有一張表Student以下所示:
NO |
NAME |
AGE |
1001 |
A |
12 |
1002 |
B |
14 |
將新學生E增長到上表中,並按照表的結構將信息添加完整,須要以下語句:
INSERT INTO STUDENT VALUSE(1003, 'E',12);
(三)修改數據
對錶中已有數據進行修改,語句句法:
UPDATE 表名SET列名1=表達式1,列名2=表達式2,…
WHERE 條件;
例如:對下表Student
NO |
NAME |
AGE |
1001 |
A |
12 |
1002 |
B |
14 |
將B的年紀改成18;應該執行如下語句:
UPDATE STUDENT SET AGE=18 WHERE NAME='B';
(四)刪除數據
刪除表中已有數據,不能刪除不存在的數據。
語句句法:
DELETE FROM 表名 WHERE 條件;
例如:
對下面Student表進行刪除,要刪除其中年紀爲12的學生;
NO |
NAME |
AGE |
1001 |
A |
12 |
1002 |
B |
14 |
DELETE FROM STUDENT WHERE AGE=12;
(五)表結構的修改
在已存在的表中增長新列,語句句法:
ALTER TABLE 表名 ADD(新列名數據類型(長度));
例如:
ALTER TABLE STUDENT ADD (DEPARTMENT CHAR(8));
b.增長已有列的數據類型。
例如:
ALTER TABLE STUDENT MODIFY(NAME VARCHAR2(25));
(六)表的刪除
將已經存在的表刪除,語句句法:
DROP TABLE表名;
例如:
DROP TABLE EMP;
(七)查詢語句 (複雜)
SELECT命令的語法爲:
SELECT [DISTINCT|ALL] {*|模式名.] {表名|視圖名|
快照名] .*…| {表達式[列別名]…} } [, [模式名. ] {表名|
視圖名|} .*…| 表達式[列別名] ]…
FROM [模式名.] {表名|視圖名|快照名} [@數據庫鏈名] [表別名]
[, [模式名.] {表名|視圖名|快照名} [@數據庫鏈名]
[表別名] ]…
[WHERE條件]
[START WITH條件 CONNECT BY條件]
[GROUP BY表達式[,表達式] …[HAVING條件]
[UNION|UNION ALL |INTERSECT|MINUS]SELECT命令
[ORDER BY{表達式|位置} [ASC|DESC] [, {表達式|位置[ASC|DESC]}]…]
例如:對於STUDENT表:
NO |
NAME |
AGE |
1001 |
AE |
12 |
1002 |
BT |
14 |
(1) 查詢年紀爲12的學生姓名;
SELECT STUDENT.NAME FROM STUDENT WHERE AGE=12;
(2) 查詢年紀在12至16歲之間的學生姓名;
SELECT STUDENT.NAME FROM STUDENT WHERE AGE BETWEEN 12 AND16;
(3) 查詢年紀不在12至16歲之間的學生姓名;
SELECT STUDENT.NAME FROM STUDENT WHERE AGE NOT BETWEEN 12AND 16;
(4) 查詢全部姓名以A開頭的學生的姓名;
SELECT STUDENT.NAME FROM STUDENT WHERE NAME LIKE 'A%';
(5) 列出全部學生年紀的和,年紀的平均值,最大值,最小值,最大值與最小值之間的差值;
SELECT AVG(AGE), SUM(AGE), MAX(AGE), MIN(AGE),MAX(AGE)-MIN(AGE);
(6) 將全部學生按學號順序升序排列;
SELECT * FROM STUDENT ORDER BY NO DESC;
(7) 將全部學生按學號順序升序排列;
SELECT * FROM STUDENT ORDER BY NO ASC;