Android 操作SQLite基本用法

來源:互聯網
上載者:User

標籤:分享   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基本用法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.