對於Android平臺來講,系統內置了豐富的API來供開發人員操做SQLite,咱們能夠輕鬆的完成對數據的存取。下面就向你們介紹一下SQLite經常使用的操做方法。本篇文章主要用到SQLiteDatabase的一些函數。html
佈局文件爲:java
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/insert" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="插入"/> <Button android:id="@+id/updataG" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="更新分數"/> <Button android:id="@+id/updataA" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="更新年齡"/> <Button android:id="@+id/delete" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="刪除"/> <Button android:id="@+id/select" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="查找"/> <Button android:id="@+id/display" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="顯示當前數據庫"/> <Button android:id="@+id/close" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="關閉"/> <ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="wrap_content"></ListView> </LinearLayout>
因爲數據庫中操做的對象時Student類,所以咱們看一下Student.java代碼:android
import java.lang.String; public class Student { int _id;//與所創建的表對應 String name; int age; int grade; String info; public Student(String name,int age,int grade,String info){ this.name=name; this.age=age; this.grade=grade; this.info=info; } public Student(){ } }
從Student類的定義能夠看出,它有5個成員變量,其中第一個成員變量是其‘主鍵’,這個名稱與數據庫中表的主鍵要徹底一致。git
下面咱們看一下MainActivity.java代碼:sql
import java.util.ArrayList; import java.util.List; import android.os.Bundle; import android.util.Log; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.Toast; import android.app.Activity; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.view.View; import android.view.View.OnClickListener; public class MainActivity extends Activity implements OnClickListener{ public static final String DB_NAME="studentdata.db"; Button insertBtn; Button updataGBtn; Button updataABtn; Button deleteBtn; Button selectBtn; Button displayBtn; Button closeBtn; ListView mListView; SQLiteDatabase db; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView=new ListView(this); BtnInit(); OpenCreateDB(); } public void OpenCreateDB(){ db = openOrCreateDatabase(DB_NAME, this.MODE_PRIVATE, null); db.execSQL("DROP TABLE IF EXISTS students"); db.execSQL("CREATE TABLE IF NOT EXISTS students (_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age INTEGER,grade INTEGER, info VARCHAR)"); } //插入數據到students表 public void InsertData(){ Student liSi =new Student("李四", 22, 87, "南京郵電大學 通訊工程"); Student liHua = new Student("李華", 23, 78, "南京郵電大學 軟件工程"); db.execSQL("INSERT INTO students VALUES (NULL,?,?,?,?)", new Object[]{"張三",21,98,"南京郵電大學 電子信息工程"}); db.execSQL("INSERT INTO students VALUES (NULL,?,?,?,?)", new Object[]{liSi.name,liSi.age,liSi.grade,liSi.info}); db.execSQL("INSERT INTO students VALUES (NULL,'王五',19,99,'南京郵電大學 網絡工程')"); ContentValues cvOfLiHua = new ContentValues(); cvOfLiHua.put("name", liHua.name); cvOfLiHua.put("age", liHua.age); cvOfLiHua.put("grade", liHua.grade); cvOfLiHua.put("info", liHua.info); db.insert("students", null, cvOfLiHua); Log.d("msg","插入結束"); Toast.makeText(this, "插入數據完成!", Toast.LENGTH_SHORT).show(); } public void UpdateGrade(){ ContentValues cv = new ContentValues(); cv.put("grade", 85); //更新數據,將李四的成績改成85分 db.update("students", cv, "name = ?", new String[]{"李四"}); Log.d("msg","李四的成績已更新"); Toast.makeText(this, "李四的成績已更新", Toast.LENGTH_SHORT).show(); } public void UpdateAge(){ String sqlString="UPDATE students SET age=18 WHERE grade= 78"; db.execSQL(sqlString); Log.d("msg","李華的年齡已更新"); Toast.makeText(this, "李華的年齡已更新", Toast.LENGTH_SHORT).show(); } public void Delete(){ db.execSQL("DELETE FROM students WHERE name='張三'"); Log.d("msg","張三的信息已經被刪除"); Toast.makeText(this, "張三的信息已經被刪除", Toast.LENGTH_SHORT).show(); } public void Select(){ List<String> list=new ArrayList<String>(); Cursor c = db.rawQuery("SELECT * FROM students WHERE grade >= ?", new String[]{"86"}); Log.d("msg","--------------大於86分的同窗----------------------------"); while (c.moveToNext()) { Student person = new Student(); person._id = c.getInt(c.getColumnIndex("_id")); person.name = c.getString(c.getColumnIndex("name")); person.grade=c.getInt(c.getColumnIndex("grade")); person.age = c.getInt(c.getColumnIndex("age")); person.info = c.getString(c.getColumnIndex("info")); String string=""+person._id+" "+person.name+" "+person.grade+" "+person.age+" "+person.info; list.add(string); Log.d("msg",string); } c.close(); ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,list); mListView.setAdapter(adapter); } public void Display(){ List<String> list=new ArrayList<String>(); Cursor c = db.rawQuery("SELECT * FROM students", null); while (c.moveToNext()) { Student person = new Student(); person._id = c.getInt(c.getColumnIndex("_id")); person.name = c.getString(c.getColumnIndex("name")); person.grade=c.getInt(c.getColumnIndex("grade")); person.age = c.getInt(c.getColumnIndex("age")); person.info = c.getString(c.getColumnIndex("info")); String string=""+person._id+" "+person.name+" "+person.grade+" "+person.age+" "+person.info; list.add(string); Log.d("msg",string); } c.close(); ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,list); mListView.setAdapter(adapter); } public void Close(){ db.close(); } public void BtnInit(){ insertBtn=(Button)findViewById(R.id.insert); updataGBtn=(Button)findViewById(R.id.updataG); updataABtn=(Button)findViewById(R.id.updataA); deleteBtn=(Button)findViewById(R.id.delete); selectBtn=(Button)findViewById(R.id.select); displayBtn=(Button)findViewById(R.id.display); closeBtn=(Button)findViewById(R.id.close); mListView=(ListView)findViewById(R.id.listview); insertBtn.setOnClickListener(this); updataABtn.setOnClickListener(this); updataGBtn.setOnClickListener(this); deleteBtn.setOnClickListener(this); selectBtn.setOnClickListener(this); displayBtn.setOnClickListener(this); closeBtn.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch(v.getId()){ case R.id.insert: InsertData(); break; case R.id.updataA: UpdateAge(); break; case R.id.updataG: UpdateGrade(); break; case R.id.display: Display(); break; case R.id.delete: Delete(); break; case R.id.select: Select(); break; case R.id.close: Close(); break; } } }
數據庫的創建與打開:OpenCreateDB()函數完成。咱們聲明一個成員變量SQLiteDatabasedb;經過執行系統的API函數openOrCreateDatabase打開或新建一個數據庫。經過執行db的execSQL函數執行建立表的一個SQL語句來建立students表。執行完以後,會在系統的/data/data/[PACKAGE_NAME]/databases目錄下出現數據庫文件數據庫
此時,至關於有一張students的空表:windows
students網絡
_id[INTEGER]數據結構 |
name[VARCHAR]app |
grade[INTEGER] |
age[INTEGER] |
info[VARCHAR] |
|
|
|
|
|
插入操做:插入操做由函數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 |
南京郵電大學軟件工程 |
更新操做:UpdateAge()和UpdateGrade()兩個函數完成。體現了更新數據兩種方式:
(a) publicvoid execSQL (Stringsql)
(b) ContentValues與update函數相結合的方式
publicint update(Stringtable,ContentValuesvalues,StringwhereClause,String[]whereArgs)
(c) 固然,咱們也能夠用publicvoid execSQL (Stringsql,Object[]bindArgs)函數,將參數先用’?’代替,而後再bindArgs中賦值。
刪除操做:由Delete函數完成。刪除操做能夠直接用execSQL執行SQL語言。固然,也能夠用publicint delete (Stringtable,StringwhereClause,String[]whereArgs)函數,和更新同樣,也有三種調用方式,在此否則贅述。
查詢操做:由函數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); //返回當前行指定列的值
顯示操做:Display函數完成。咱們首先得到表中第一列的Cursor對象,而後逐步遍歷便可。咱們能夠經過以下語句得到:
Cursor c = db.rawQuery("SELECT * FROM students",null);
總結:完成數據庫的操做,大多數狀況下咱們均可以用execSQL函數來執行SQL語言便可。附錄中列舉了常見的簡單SQL語言的操做。
程序運行界面:
[圖2]
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;