Android SQLite總結(一)

前言html

對於Android平臺來講,系統內置了豐富的API來供開發人員操做SQLite,咱們能夠輕鬆的完成對數據的存取。下面就向你們介紹一下SQLite經常使用的操做方法。本篇文章主要用到SQLiteDatabase的一些函數。廢話少說,直接貼代碼!因爲數據庫中操做的對象時Student類,所以咱們看一下Student.java代碼java

 

[java]   view plain copy
<EMBED id=ZeroClipboardMovie_1 height=18 name=ZeroClipboardMovie_1 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=1&width=18&height=18" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. package com.example.njupt.zhb.sqlite1;  
  2. import java.lang.String;  
  3. public class Student {  
  4.     int _id;//與所創建的表對應  
  5.     String name;  
  6.     int age;  
  7.     int grade;  
  8.     String info;  
  9.     public Student(String name,int age,int grade,String info){  
  10.         this.name=name;  
  11.         this.age=age;  
  12.         this.grade=grade;  
  13.         this.info=info;  
  14.     }  
  15.     public Student(){  
  16.           
  17.     }  
  18. }  


Student類的定義能夠看出,它有5個成員變量,其中第一個成員變量是其‘主鍵’,這個名稱與數據庫中主鍵要徹底一致。android

下面咱們看一下MainActivity.java代碼:git

 

[java]   view plain copy
<EMBED id=ZeroClipboardMovie_2 height=18 name=ZeroClipboardMovie_2 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=2&width=18&height=18" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. package com.example.njupt.zhb.sqlite1;  
  2. import java.util.ArrayList;  
  3. import java.util.List;  
  4. import android.os.Bundle;  
  5. import android.util.Log;  
  6. import android.widget.ArrayAdapter;  
  7. import android.widget.Button;  
  8. import android.widget.ListView;  
  9. import android.widget.Toast;  
  10. import android.app.Activity;  
  11. import android.content.ContentValues;  
  12. import android.database.Cursor;  
  13. import android.database.sqlite.SQLiteDatabase;  
  14. import android.view.View;  
  15. import android.view.View.OnClickListener;  
  16. public class MainActivity extends Activity implements OnClickListener{  
  17.     public static final String DB_NAME="studentdata.db";  
  18.     Button insertBtn;  
  19.     Button updataGBtn;  
  20.     Button updataABtn;  
  21.     Button deleteBtn;  
  22.     Button selectBtn;  
  23.     Button displayBtn;  
  24.     Button closeBtn;  
  25.     ListView mListView;  
  26.     SQLiteDatabase db;  
  27.     @Override  
  28.     public void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.activity_main);  
  31.         mListView=new ListView(this);  
  32.         BtnInit();  
  33.         OpenCreateDB();  
  34.     }  
  35.     public void OpenCreateDB(){  
  36.         db = openOrCreateDatabase(DB_NAME, this.MODE_PRIVATE, null);  
  37.         db.execSQL("DROP TABLE IF EXISTS students");    
  38.         db.execSQL("CREATE TABLE IF NOT EXISTS students (_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age INTEGER,grade INTEGER, info VARCHAR)");  
  39.     }  
  40.     //插入數據到students表  
  41.     public void InsertData(){  
  42.         Student liSi =new Student("李四"2287"南京郵電大學 通訊工程");  
  43.         Student liHua = new Student("李華"2378"南京郵電大學 軟件工程");  
  44.         db.execSQL("INSERT INTO students VALUES (NULL,?,?,?,?)"new Object[]{"張三",21,98,"南京郵電大學 電子信息工程"});  
  45.         db.execSQL("INSERT INTO students VALUES (NULL,?,?,?,?)"new Object[]{liSi.name,liSi.age,liSi.grade,liSi.info});  
  46.         db.execSQL("INSERT INTO students VALUES (NULL,'王五',19,99,'南京郵電大學 網絡工程')");  
  47.         ContentValues cvOfLiHua = new ContentValues();  
  48.         cvOfLiHua.put("name", liHua.name);  
  49.         cvOfLiHua.put("age", liHua.age);  
  50.         cvOfLiHua.put("grade", liHua.grade);  
  51.         cvOfLiHua.put("info", liHua.info);  
  52.         db.insert("students"null, cvOfLiHua);  
  53.         Log.d("msg","插入結束");  
  54.         Toast.makeText(this"插入數據完成!", Toast.LENGTH_SHORT).show();  
  55.     }  
  56.     public void UpdateGrade(){  
  57.         ContentValues cv = new ContentValues();    
  58.         cv.put("grade"85);    
  59.         //更新數據,將李四的成績改成85分  
  60.         db.update("students", cv, "name = ?"new String[]{"李四"});    
  61.         Log.d("msg","李四的成績已更新");  
  62.         Toast.makeText(this"李四的成績已更新", Toast.LENGTH_SHORT).show();  
  63.     }  
  64.     public void UpdateAge(){  
  65.         String sqlString="UPDATE students SET age=18 WHERE grade= 78";  
  66.         db.execSQL(sqlString);  
  67.         Log.d("msg","李華的年齡已更新");  
  68.         Toast.makeText(this"李華的年齡已更新", Toast.LENGTH_SHORT).show();  
  69.     }  
  70.     public void Delete(){  
  71.         db.execSQL("DELETE FROM students WHERE name='張三'");  
  72.         Log.d("msg","張三的信息已經被刪除");  
  73.         Toast.makeText(this"張三的信息已經被刪除", Toast.LENGTH_SHORT).show();  
  74.     }  
  75.     public void Select(){  
  76.         List<String> list=new ArrayList<String>();  
  77.         Cursor c = db.rawQuery("SELECT * FROM students WHERE grade >= ?"new String[]{"86"});  
  78.         Log.d("msg","--------------大於86分的同窗----------------------------");  
  79.         while (c.moveToNext()) {  
  80.             Student person = new Student();  
  81.             person._id = c.getInt(c.getColumnIndex("_id"));  
  82.             person.name = c.getString(c.getColumnIndex("name"));  
  83.             person.grade=c.getInt(c.getColumnIndex("grade"));  
  84.             person.age = c.getInt(c.getColumnIndex("age"));  
  85.             person.info = c.getString(c.getColumnIndex("info"));  
  86.             String string=""+person._id+" "+person.name+" "+person.grade+" "+person.age+" "+person.info;  
  87.             list.add(string);  
  88.             Log.d("msg",string);  
  89.         }  
  90.         c.close();  
  91.         ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,list);  
  92.         mListView.setAdapter(adapter);  
  93.     }  
  94.     public void Display(){  
  95.         List<String> list=new ArrayList<String>();  
  96.         Cursor c = db.rawQuery("SELECT * FROM students"null);  
  97.         while (c.moveToNext()) {  
  98.             Student person = new Student();  
  99.             person._id = c.getInt(c.getColumnIndex("_id"));  
  100.             person.name = c.getString(c.getColumnIndex("name"));  
  101.             person.grade=c.getInt(c.getColumnIndex("grade"));  
  102.             person.age = c.getInt(c.getColumnIndex("age"));  
  103.             person.info = c.getString(c.getColumnIndex("info"));  
  104.             String string=""+person._id+" "+person.name+" "+person.grade+" "+person.age+" "+person.info;  
  105.             list.add(string);  
  106.             Log.d("msg",string);  
  107.         }  
  108.         c.close();  
  109.         ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,list);  
  110.         mListView.setAdapter(adapter);  
  111.     }  
  112.     public void Close(){  
  113.         db.close();  
  114.     }  
  115.     public void BtnInit(){  
  116.         insertBtn=(Button)findViewById(R.id.insert);  
  117.         updataGBtn=(Button)findViewById(R.id.updataG);  
  118.         updataABtn=(Button)findViewById(R.id.updataA);  
  119.         deleteBtn=(Button)findViewById(R.id.delete);  
  120.         selectBtn=(Button)findViewById(R.id.select);  
  121.         displayBtn=(Button)findViewById(R.id.display);  
  122.         closeBtn=(Button)findViewById(R.id.close);  
  123.         mListView=(ListView)findViewById(R.id.listview);  
  124.         insertBtn.setOnClickListener(this);  
  125.         updataABtn.setOnClickListener(this);  
  126.         updataGBtn.setOnClickListener(this);  
  127.         deleteBtn.setOnClickListener(this);  
  128.         selectBtn.setOnClickListener(this);  
  129.         displayBtn.setOnClickListener(this);  
  130.         closeBtn.setOnClickListener(this);  
  131.     }  
  132.     @Override  
  133.     public void onClick(View v) {  
  134.         // TODO Auto-generated method stub  
  135.         switch(v.getId()){  
  136.         case R.id.insert:  
  137.             InsertData();  
  138.             break;  
  139.         case R.id.updataA:  
  140.             UpdateAge();  
  141.             break;  
  142.         case R.id.updataG:  
  143.             UpdateGrade();  
  144.             break;  
  145.         case R.id.display:  
  146.             Display();  
  147.             break;  
  148.         case R.id.delete:  
  149.             Delete();  
  150.             break;  
  151.         case R.id.select:  
  152.             Select();  
  153.             break;  
  154.         case R.id.close:  
  155.             Close();  
  156.             break;  
  157.         }  
  158.     }  
  159. }  


咱們一點點的看吧。web

1.      佈局:這個Activity和通常的Activity沒有太大的區別,它有7個按鈕控件和一個ListView控件(詳細布局見見面的佈局文件)。BtnInit()函數是將控件與佈局文件相關聯,而且設置相應的點擊事件處理。每個點擊分別對應一個函數。sql

2.      數據庫的創建與打開OpenCreateDB()函數完成。咱們聲明一個成員變量SQLiteDatabasedb;經過執行系統的API函數openOrCreateDatabase打開或新建一個數據庫。經過執行dbexecSQL函數執行建立表的一個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)ContentValuesinsert函數相結合的方式

執行完以後,咱們能夠經過點擊‘顯示當前數據庫’按鈕,來查看當前數據庫中的信息。

_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)  ContentValuesupdate函數相結合的方式

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類型的對象。這個對象指向查詢結果集第一行。咱們能夠經過調用CursormoveToNext函數對查詢到的結果集進行遍歷。

查詢的函數還有:

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]

佈局文件爲:

 

[html]   view plain copy
<EMBED id=ZeroClipboardMovie_3 height=18 name=ZeroClipboardMovie_3 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=3&width=18&height=18" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent">  
  6.     <Button  
  7.         android:id="@+id/insert"  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="插入"/>  
  11.     <Button  
  12.         android:id="@+id/updataG"  
  13.         android:layout_width="fill_parent"  
  14.         android:layout_height="wrap_content"  
  15.         android:text="更新分數"/>  
  16.     <Button  
  17.         android:id="@+id/updataA"  
  18.         android:layout_width="fill_parent"  
  19.         android:layout_height="wrap_content"  
  20.         android:text="更新年齡"/>  
  21.     <Button  
  22.         android:id="@+id/delete"  
  23.         android:layout_width="fill_parent"  
  24.         android:layout_height="wrap_content"  
  25.         android:text="刪除"/>  
  26.    <Button  
  27.         android:id="@+id/select"  
  28.         android:layout_width="fill_parent"  
  29.         android:layout_height="wrap_content"  
  30.         android:text="查找"/>  
  31.     <Button  
  32.         android:id="@+id/display"  
  33.         android:layout_width="fill_parent"  
  34.         android:layout_height="wrap_content"  
  35.         android:text="顯示當前數據庫"/>  
  36.     <Button  
  37.         android:id="@+id/close"  
  38.         android:layout_width="fill_parent"  
  39.         android:layout_height="wrap_content"  
  40.         android:text="關閉"/>  
  41.     <ListView   
  42.         android:id="@+id/listview"  
  43.         android:layout_width="fill_parent"  
  44.         android:layout_height="wrap_content"></ListView>  
  45. </LinearLayout>  


整個項目的源代碼: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 AGE12

()表結構的修改

在已存在的表中增長新列,語句句法:

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) 查詢年紀在1216歲之間的學生姓名;

SELECT STUDENT.NAME FROM STUDENT WHERE AGE BETWEEN 12 AND16;

(3) 查詢年紀1216歲之間的學生姓名;

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;

相關文章
相關標籤/搜索