標籤:分享 selection sqlite r.java instr query 判斷 group 分頁
一.SQLite的介紹
1.SQLite簡介
SQLite是一款輕型的資料庫,是遵守ACID的關聯式資料庫管理系統,它的設計目標是嵌入 式的,而且目前已經在很多嵌入式產品中使用了它,它佔用資源非常的低,在嵌入式裝置中,可能只需要幾百K的記憶體就夠了。它能夠支援 Windows/Linux/Unix等等主流的作業系統,同時能夠跟很多程式語言相結合,比如Tcl、PHP、Java、C++、.Net等,還有ODBC介面,同樣比起 Mysql、PostgreSQL這兩款開源世界著名的資料庫管理系統來講,它的處理速度比他們都快。
2.SQLite的特點:
SQLite和C/S模式的資料庫軟體不同,它是進程內的資料庫引擎,因此不存在資料庫的用戶端和伺服器。使用SQLite一般只需要帶上它的一個動態 庫,就可以享受它的全部功能。而且那個動態庫的尺寸也挺小,以版本3.6.11為例,Windows下487KB、Linux下347KB。
SQLite的核心引擎本身不依賴第三方的軟體,使用它也不需要"安裝"。有點類似那種綠色軟體。
資料庫中所有的資訊(比如表、視圖等)都包含在一個檔案內。這個檔案可以自由複製到其它目錄或其它機器上。
除了主流作業系統 windows,linux之後,SQLite還支援其它一些不常用的作業系統。
同一列中的資料可以是不同類型
這個相信大家都懂的!!!!!!!!!!!!
3.SQLite資料類型
一般資料採用的固定的待用資料類型,而SQLite採用的是動態資料類型,會根據存入值自動判斷。SQLite具有以下五種常用的資料類型:
NULL: 這個值為空白值
VARCHAR(n):長度不固定且其最大長度為 n 的字串,n不能超過 4000。
CHAR(n):長度固定為n的字串,n不能超過 254。
INTEGER: 值被標識為整數,依據值的大小可以依次被儲存為1,2,3,4,5,6,7,8.
REAL: 所有值都是浮動的數值,被儲存為8位元組的IEEE浮動標記序號.
TEXT: 值為文本字串,使用資料庫編碼儲存(TUTF-8, UTF-16BE or UTF-16-LE).
BLOB: 值是BLOB資料區塊,以輸入的資料格式進行儲存。如何輸入就如何儲存,不改 變格式。
DATA :包含了 年份、月份、日期。
TIME: 包含了 小時、分鐘、秒。
相信學過資料庫的童鞋對這些資料類型都不陌生的!!!!!!!!!!
二.SQLiteDatabase的介紹
Android提供了建立和是用SQLite資料庫的API。SQLiteDatabase代表一個資料庫物件,提供了操作資料庫的一些方法。在Android的SDK目錄下有sqlite3工具,我們可以利用它建立資料庫、建立表和執行一些SQL語句。下面是SQLiteDatabase的常用方法。
SQLiteDatabase的常用方法
| 方法名稱 |
方法表示含義 |
| openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory) |
開啟或建立資料庫 |
| insert(String table,String nullColumnHack,ContentValues values) |
插入一條記錄 |
| delete(String table,String whereClause,String[] whereArgs) |
刪除一條記錄 |
| query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy) |
查詢一條記錄 |
| update(String table,ContentValues values,String whereClause,String[] whereArgs) |
修改記錄 |
| execSQL(String sql) |
執行一條SQL語句 |
| close() |
關閉資料庫 |
Google公司命名這些方法的名稱都是非常形象的。例如openOrCreateDatabase,我們從字面英文含義就能看出這是個開啟或建立資料庫的方法。
1、開啟或者建立資料庫
在Android 中使用SQLiteDatabase的靜態方法openOrCreateDatabase(String path,SQLiteDatabae.CursorFactory factory)開啟或者建立一個資料庫。它會自動去檢測是否存在這個資料庫,如果存在則開啟,不存在則建立一個資料庫;建立成功則返回一個SQLiteDatabase對象,否則拋出異常FileNotFoundException。
下面是建立名為“stu.db”資料庫的代碼:
openOrCreateDatabase(String path,SQLiteDatabae.CursorFactory factory)
參數1 資料庫建立的路徑
參數2 一般設定為null就可以了
db=SQLiteDatabase.openOrCreateDatabase("/data/data/com.lingdududu.db/databases/stu.db",null);
2、建立表
建立一張表的步驟很簡單:
- 編寫建立表的SQL語句
- 調用SQLiteDatabase的execSQL()方法來執行SQL語句
下面的代碼建立了一張使用者表,屬性列為:id(主鍵並且自動增加)、sname(學生姓名)、snumber(學號)
private void createTable(SQLiteDatabase db){ //建立表SQL語句 String stu_table="create table usertable(_id integer primary key autoincrement,sname text,snumber text)"; //執行SQL語句 db.execSQL(stu_table); }
3、插入資料
插入資料有兩種方法:
①SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues values)方法,
參數1 表名稱,
參數2 空列的預設值
參數3 ContentValues類型的一個封裝了列名稱和列值的Map;
②編寫插入資料的SQL語句,直接調用SQLiteDatabase的execSQL()方法來執行
第一種方法的代碼:
private void insert(SQLiteDatabase db){ //執行個體化常量值 ContentValues cValue = new ContentValues(); //添加使用者名稱 cValue.put("sname","xiaoming"); //添加密碼 cValue.put("snumber","01005"); //調用insert()方法插入資料 db.insert("stu_table",null,cValue); }
第二種方法的代碼:
private void insert(SQLiteDatabase db){ //插入資料SQL語句 String stu_sql="insert into stu_table(sname,snumber) values(‘xiaoming‘,‘01005‘)"; //執行SQL語句 db.execSQL(sql); }
4、刪除資料
刪除資料也有兩種方法:
①調用SQLiteDatabase的delete(String table,String whereClause,String[] whereArgs)方法
參數1 表名稱
參數2 刪除條件
參數3 刪除條件值數組
②編寫刪除SQL語句,調用SQLiteDatabase的execSQL()方法來執行刪除。
第一種方法的代碼:
private void delete(SQLiteDatabase db) { //刪除條件 String whereClause = "id=?"; //刪除條件參數 String[] whereArgs = {String.valueOf(2)}; //執行刪除 db.delete("stu_table",whereClause,whereArgs); }
第二種方法的代碼:
private void delete(SQLiteDatabase db) { //刪除SQL語句 String sql = "delete from stu_table where _id = 6"; //執行SQL語句 db.execSQL(sql); }
5、修改資料
修改資料有兩種方法:
①調用SQLiteDatabase的update(String table,ContentValues values,String whereClause, String[] whereArgs)方法
參數1 表名稱
參數2 跟行列ContentValues類型的索引值對Key-Value
參數3 更新條件(where字句)
參數4 更新條件數組
②編寫更新的SQL語句,調用SQLiteDatabase的execSQL執行更新。
第一種方法的代碼:
private void update(SQLiteDatabase db) { //執行個體化內容值 ContentValues values = new ContentValues(); //在values中新增內容 values.put("snumber","101003"); //修改條件 String whereClause = "id=?"; //修改添加參數 String[] whereArgs={String.valuesOf(1)}; //修改 db.update("usertable",values,whereClause,whereArgs); }
第二種方法的代碼:
private void update(SQLiteDatabase db){ //修改SQL語句 String sql = "update stu_table set snumber = 654321 where id = 1"; //執行SQL db.execSQL(sql); }
6、查詢資料
在Android中查詢資料是通過Cursor類來實現的,當我們使用SQLiteDatabase.query()方法時,會得到一個Cursor對象,Cursor指向的就是每一條資料。它提供了很多有關查詢的方法,具體方法如下:
public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);
各個參數的意義說明:
參數table:表名稱
參數columns:列名稱數組
參數selection:條件字句,相當於where
參數selectionArgs:條件字句,參數數組
參數groupBy:分組列
參數having:分組條件
參數orderBy:排序列
參數limit:分頁查詢限制
參數Cursor:傳回值,相當於結果集ResultSet
Cursor是一個遊標介面,提供了遍曆查詢結果的方法,如移動指標方法move(),獲得列值方法getString()等.
Cursor遊標常用方法
| 方法名稱 |
方法描述 |
| getCount() |
獲得總的資料項目數 |
| isFirst() |
判斷是否第一條記錄 |
| isLast() |
判斷是否最後一條記錄 |
| moveToFirst() |
移動到第一條記錄 |
| moveToLast() |
移動到最後一條記錄 |
| move(int offset) |
移動到指定記錄 |
| moveToNext() |
移動到下一條記錄 |
| moveToPrevious() |
移動到上一條記錄 |
| getColumnIndexOrThrow(String columnName) |
根據列名稱獲得列索引 |
| getInt(int columnIndex) |
獲得指定列索引的int類型值 |
| getString(int columnIndex) |
獲得指定列縮影的String類型值 |
下面就是用Cursor來查詢資料庫中的資料,具體代碼如下:
private void query(SQLiteDatabase db) { //查詢獲得遊標 Cursor cursor = db.query ("usertable",null,null,null,null,null,null); //判斷遊標是否為空白 if(cursor.moveToFirst() { //遍曆遊標 for(int i=0;i<cursor.getCount();i++){ cursor.move(i); //獲得ID int id = cursor.getInt(0); //獲得使用者名稱 String username=cursor.getString(1); //獲得密碼 String password=cursor.getString(2); //輸出使用者資訊 System.out.println(id+":"+sname+":"+snumber); } } }
7、刪除指定表
編寫插入資料的SQL語句,直接調用SQLiteDatabase的execSQL()方法來執行
private void drop(SQLiteDatabase db){ //刪除表的SQL語句 String sql ="DROP TABLE stu_table"; //執行SQL db.execSQL(sql); }
三. SQLiteOpenHelper
該類是SQLiteDatabase一個輔助類。這個類主要產生一 個資料庫,並對資料庫的版本進行管理。當在程式當中調用這個類的方法getWritableDatabase()或者 getReadableDatabase()方法的時候,如果當時沒有資料,那麼Android系統就會自動產生一個資料庫。 SQLiteOpenHelper 是一個抽象類別,我們通常需要繼承它,並且實現裡面的3個函數:
1.onCreate(SQLiteDatabase)
在資料庫第一次產生的時候會調用這個方法,也就是說,只有在建立資料庫的時候才會調用,當然也有一些其它的情況,一般我們在這個方法裡邊產生資料庫表。
2. onUpgrade(SQLiteDatabase,int,int)
當資料庫需要升級的時候,Android系統會主動的調用這個方法。一般我們在這個方法裡邊刪除資料表,並建立新的資料表,當然是否還需要做其他的操作,完全取決於應用的需求。
3. onOpen(SQLiteDatabase):
這是當開啟資料庫時的回呼函數,一般在程式中不是很常使用。
寫了這麼多,改用用實際例子來說明上面的內容了。下面這個操作資料庫的執行個體實現了建立資料庫,建立表以及資料庫的增刪改查的操作。
該執行個體有兩個類:
com.lingdududu.testSQLite 調試類
com.lingdududu.testSQLiteDb 資料庫輔助類
SQLiteActivity.java
package com.lingdududu.testSQLite;import com.lingdududu.testSQLiteDb.StuDBHelper;import android.app.Activity;import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;/** @author lingdududu*/public class SQLiteActivity extends Activity {/** Called when the activity is first created. *///聲明各個按鈕private Button createBtn;private Button insertBtn;private Button updateBtn;private Button queryBtn;private Button deleteBtn;private Button ModifyBtn;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);//調用creatView方法creatView();//setListener方法setListener(); }//通過findViewById獲得Button對象的方法private void creatView(){createBtn = (Button)findViewById(R.id.createDatabase);updateBtn = (Button)findViewById(R.id.updateDatabase);insertBtn = (Button)findViewById(R.id.insert);ModifyBtn = (Button)findViewById(R.id.update);queryBtn = (Button)findViewById(R.id.query);deleteBtn = (Button)findViewById(R.id.delete);}//為按鈕註冊監聽的方法private void setListener(){createBtn.setOnClickListener(new CreateListener());updateBtn.setOnClickListener(new UpdateListener());insertBtn.setOnClickListener(new InsertListener());ModifyBtn.setOnClickListener(new ModifyListener());queryBtn.setOnClickListener(new QueryListener());deleteBtn.setOnClickListener(new DeleteListener());}//建立資料庫的方法class CreateListener implements OnClickListener{@Overridepublic void onClick(View v) {//建立StuDBHelper對象StuDBHelper dbHelper = new StuDBHelper(SQLiteActivity.this,"stu_db",null,1);//得到一個可讀的SQLiteDatabase對象SQLiteDatabase db =dbHelper.getReadableDatabase();} }//更新資料庫的方法class UpdateListener implements OnClickListener{@Overridepublic void onClick(View v) {// 資料庫版本的更新,由原來的1變為2StuDBHelper dbHelper = new StuDBHelper(SQLiteActivity.this,"stu_db",null,2);SQLiteDatabase db =dbHelper.getReadableDatabase();} }//插入資料的方法class InsertListener implements OnClickListener{@Overridepublic void onClick(View v) {StuDBHelper dbHelper = new StuDBHelper(SQLiteActivity.this,"stu_db",null,1);//得到一個可寫的資料庫SQLiteDatabase db =dbHelper.getWritableDatabase();//產生ContentValues對象 //key:列名,value:想插入的值 ContentValues cv = new ContentValues();//往ContentValues對象存放資料,鍵-值對模式cv.put("id", 1);cv.put("sname", "xiaoming");cv.put("sage", 21);cv.put("ssex", "male");//調用insert方法,將資料插入資料庫db.insert("stu_table", null, cv);//關閉資料庫db.close();} }//查詢資料的方法class QueryListener implements OnClickListener{@Overridepublic void onClick(View v) {StuDBHelper dbHelper = new StuDBHelper(SQLiteActivity.this,"stu_db",null,1);//得到一個可寫的資料庫SQLiteDatabase db =dbHelper.getReadableDatabase();//參數1:表名 //參數2:要想顯示的列 //參數3:where子句 //參數4:where子句對應的條件值 //參數5:分組方式 //參數6:having條件 //參數7:排序方式 Cursor cursor = db.query("stu_table", new String[]{"id","sname","sage","ssex"}, "id=?", new String[]{"1"}, null, null, null);while(cursor.moveToNext()){String name = cursor.getString(cursor.getColumnIndex("sname"));String age = cursor.getString(cursor.getColumnIndex("sage"));String sex = cursor.getString(cursor.getColumnIndex("ssex"));System.out.println("query------->" + "姓名:"+name+" "+"年齡:"+age+" "+"性別:"+sex);}//關閉資料庫db.close();} }//修改資料的方法class ModifyListener implements OnClickListener{@Overridepublic void onClick(View v) {StuDBHelper dbHelper = new StuDBHelper(SQLiteActivity.this,"stu_db",null,1);//得到一個可寫的資料庫SQLiteDatabase db =dbHelper.getWritableDatabase();ContentValues cv = new ContentValues();cv.put("sage", "23");//where 子句 "?"是預留位置號,對應後面的"1",String whereClause="id=?";String [] whereArgs = {String.valueOf(1)};//參數1 是要更新的表名//參數2 是一個ContentValeus對象//參數3 是where子句db.update("stu_table", cv, whereClause, whereArgs);}}//刪除資料的方法class DeleteListener implements OnClickListener{@Overridepublic void onClick(View v) {StuDBHelper dbHelper = new StuDBHelper(SQLiteActivity.this,"stu_db",null,1);//得到一個可寫的資料庫SQLiteDatabase db =dbHelper.getReadableDatabase();String whereClauses = "id=?";String [] whereArgs = {String.valueOf(2)};//調用delete方法,刪除資料 db.delete("stu_table", whereClauses, whereArgs);} }}
StuDBHelper.java
package com.lingdududu.testSQLiteDb; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; public class StuDBHelper extends SQLiteOpenHelper { private static final String TAG = "TestSQLite"; public static final int VERSION = 1; //必須要有建構函式 public StuDBHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } // 當第一次建立資料庫的時候,調用該方法 public void onCreate(SQLiteDatabase db) { String sql = "create table stu_table(id int,sname varchar(20),sage int,ssex varchar(10))"; //輸出建立資料庫的日誌資訊 Log.i(TAG, "create Database------------->"); //execSQL函數用於執行SQL語句 db.execSQL(sql); } //當更新資料庫的時候執行該方法 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //輸出更新資料庫的日誌資訊 Log.i(TAG, "update Database------------->"); } }
main.xml
<?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" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/createDatabase" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="建立資料庫" /> <Button android:id="@+id/updateDatabase" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="更新資料庫" /> <Button android:id="@+id/insert" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="插入資料" /> <Button android:id="@+id/update" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="更新資料" /> <Button android:id="@+id/query" 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="刪除資料" /> </LinearLayout>
程式啟動並執行:
使用adb命令查看資料庫:
1.在命令列視窗輸入adb shell斷行符號,就進入了Linux命令列,現在就可以使用Linux的命令了。
2.ls斷行符號,顯示所有的東西,其中有個data。
3.cd data斷行符號,再ls斷行符號,cd data斷行符號,ls斷行符號後就會看到很多的com................,那就是系統上的應用程式套件組合名,找到你資料庫程式的包名,然後進入。
4.進去後在查看所有,會看到有databases,進入databases,顯示所有就會發現你的資料庫名字,這裡使用的是"stu_db"。
5.sqlite3 stu_db斷行符號就進入了你的資料庫了,然後“.schema”就會看到該應用程式的所有表及建表語句。
6.之後就可以使用標準的SQL語句查看剛才產生的資料庫及對資料執行增刪改查了。
註:ls,cd等命令都是linux的基本命令,不瞭解的同學可以看看有關這方面的資料。
下面介紹幾個在SQLite中常用到的adb命令:
查看
.database 顯示資料庫資訊;
.tables 顯示表名稱;
.schema 命令可以查看建立資料表時的SQL命令;
.schema table_name 查看建立表table_name時的SQL的命令;
插入記錄
insert into table_name values (field1, field2, field3...);
查詢
select * from table_name;查看table_name表中所有記錄;
select * from table_name where field1=‘xxxxx‘; 查詢符合指定條件的記錄;
刪除
drop table_name; 刪除表;
drop index_name; 刪除索引;
-------------------------------------------查詢,插入,刪除等操作資料庫的語句記得不要漏了;----------------------------------------
# sqlite3 stu_db
sqlite3 stu_db
SQLite version 3.6.22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .schema
.schema
CREATE TABLE android_metadata (locale TEXT);
CREATE TABLE stu_table(id int,sname varchar(20),sage int,ssex varchar(10)); --->建立的表
sqlite> select * from stu_table;
select * from stu_table;
1|xiaoming|21|male
sqlite>
插入資料
sqlite> insert into stu_table values(2,‘xiaohong‘,20,‘female‘);
插入的資料記得要和表中的屬性一一對應
insert into stu_table values(2,‘xiaohong‘,20,‘female‘);
sqlite> select * from stu_table;
select * from stu_table;
1|xiaoming|21|male
2|xiaohong|20|female --------------> 插入的資料
sqlite>
當點擊修改資料的按鈕時候
sqlite> select * from stu_table;
select * from stu_table;
1|xiaoming|23|male -------------->年齡被修改為23
2|xiaohong|20|female
sqlite>
當點擊刪除資料的按鈕
sqlite> select * from stu_table;
select * from stu_table;
1|xiaoming|23|male id=2的資料已經被刪除
Android 操作SQLite基本用法