Android使用SQLite資料庫的示例

Android使用SQLite資料庫的示例

一. 簡介

SQLite資料庫是一個輕量級的DBMS(資料庫管理系統)。SQLite使用單個檔案儲存資料,Android標準庫包含SQLite庫以及配套使用的一些Java輔助類。主要特點:輕量級,單一檔案,跨平臺,開源。

二. Android中SQLite資料庫的使用

1、建立SQLite資料庫


SQLiteDatabase db=
SQLiteDatabase.openOrCreateDatabase(
"/data/data/"   getPackageName()   "/test.db",
null);

執行完這條語句,可以在adb shell下進入/data/data/package-name/下看到剛才建立的資料庫檔案

這裡寫圖片描述 

在Android中使用SQLiteDatabase的靜態方法
openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)開啟或者建立一個資料庫。

它會自動去檢測是否存在這個資料庫,如果存在則開啟,反之不存在就建立一個資料庫;建立成功則返回一個SQLiteDatabase物件,失敗丟擲FileNotFoundException異常。

除了以上方法,Android還提供了SQLiteOpenHelper這個類來建立資料庫,首先繼承SQLiteOpenHelper,重寫onCreate和onUpgrade方法及構造方法


public class MySqliteHelper extends SQLiteOpenHelper{
public MySqliteHelper(Context context) {
super(context, "mysqlite.db", null, 1);
//傳入四個引數
//第一個引數context 上下文物件
//第二個引數mysqlite.db 資料庫名稱(檔名)
//第三個引數一般為null
//第四個引數資料庫版本號,這裡寫1
}
@Override
public void onCreate(SQLiteDatabase db) {
/* 資料庫建立的時候會回撥此方法,可以用db物件執行SQL語
* 句,建立所需要的表
*/
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//當資料庫升級時呼叫此方法
}
}

接著在需要建立資料庫的時候呼叫


SQLiteOpenHelper dbHelper = new MySqliteHelper(this);
SQLiteDatabase db = dbHelper.getWritableDatabase();

使用SQLiteOpenHelper建立的資料庫,儲存在/data/data/package-name/databases/目錄下,通過adb shell可以看到建立的資料庫檔案

這裡寫圖片描述

2、建立資料庫中的資料表

資料庫建立完成後,要建立儲存資料的表,表是存放在資料庫中的。示例程式碼入下


private void createTable(SQLiteDatabase db){
//SQL語句
String sql = 
"create table stutable(_id integer primary key autoincrement,name text,age integer)";
db.execSQL(sql);
}

這裡附上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 :包含了 年份、月份、日期

執行完上述語句,可以通過ADM將資料庫檔案匯出到電腦上

這裡寫圖片描述 

通過視覺化工具開啟資料庫檔案可以看到之前建立的表,以及定義的表欄位

 這裡寫圖片描述

除了執行定義建立表的方法外,還可以在繼承SQLiteOpenHelper類中的onCreate方法來初始化表結構,在後面的例子使用繼承SQLiteOpenHelper方式建立表。

3、對錶進行操作(資料表的增刪改查)

增:在表中增加資料,可以使用SQLiteDatabase類中提供的execSQL(String sql)執行一條插入資料的SQL語句來插入資料,不過,AndroidSQLiteDatabase類提供了更為簡單的方法來執行插入資料操作


//SQLiteDatabase類中提供的方法
public long insert(
String table,//要操作表名 
String nullColumnHack,//空列的預設值 
ContentValues values
//ContentValues封裝了列名稱和列值的Map
); 
private void insertToTable(SQLiteDatabase db){
ContentValues cv = new ContentValues();
cv.put("name","wxq");
cv.put("age",11);
db.insert("stutable",null,cv); 
}

執行insertTable方法,再次匯出資料庫可以看到stutable表中增加了一條資料

這裡寫圖片描述

刪:好吧,剛插入一條資料。。。

同樣Android提供了delete方法


//SQLiteDatabase類中提供的方法
public int delete(
String table,//表名稱
String whereClause,//刪除條件
String[] whereArgs); //刪除條件值陣列
private void deleteToTable(SQLiteDatabase db){
//刪除條件,這裡以name為條件,也可以是age = ?
String whereClasuse = "name = ?";
//刪除條件引數,
String[] whereArgs = new String[]{"wxq"};
//執行刪除
db.delete("stutable",whereClasuse,whereArgs);
}

執行上述語句,將會刪除stutable表中剛才插入的資料。

改:


//SQLiteDatabase類中提供的方法
public int update(
//表名稱
String table,
//和行列ContentValues鍵值對應的key-value
ContentValues values,
//更新條件
String whereClause,
//更新條件陣列
String[] whereArgs
);
private void updateToTable(SQLiteDatabase db){
//例項化ContentValues
ContentValues cv= new ContentValues();
cv.put("age",23);
//更新條件
String whereClause = "name = ?";
//更新條件陣列
String[] whereArgs = new String[]{"wxq"};
db.update("stutable",cv,whereClause,whereArgs);
}

執行完更新語句,匯出資料庫檔案,在視覺化工具中檢視

這裡寫圖片描述

查:在Android中查詢資料是通過Cursor類來實現的,可以使用SQLiteDatabase.query()方法時,這裡使用別一個方法rawQuery


public Cursor rawQuery(
String sql,//查詢的SQL語句
String[] selectionArgs//當SQL語句中含有?,這裡代表值
);
public void queryToTable(SQLiteDatabase db){
String sql = "select * from stutable";//全查
Cursor c = db.rawQuery(sql,null);//這裡會返回一個Cursor(遊標)物件
}

這裡寫圖片描述

使用SQLite的一個Demo(英雄管理系統)

這裡寫圖片描述 

主要運算元據庫的程式碼


public class HeroSqliteManager {
private SQLiteOpenHelper dbHelper;
private SQLiteDatabase db;
private static HeroSqliteManager instance;
private static final String TABLE_NAME = "hero";
private static final String NAME_FIELD = "name";
private static final String ICOID_FIELD = "icoId";
private static final String ATTACK_FIELD = "attack";
private static final String DEFENSE_FIELD = "defense";
public static HeroSqliteManager getInstance() {
if (instance == null) {
synchronized (HeroSqliteManager.class) {
if (instance == null) {
instance = new HeroSqliteManager();
}
}
}
return instance;
}
private HeroSqliteManager() {
dbHelper = new HeroSqliteHelper(HeroApplication.getContext());
db = dbHelper.getWritableDatabase();
}
/**
* 插入記錄
* @param hero
*/
public void insertData(Hero hero) {
ContentValues cv = new ContentValues();
cv.put(NAME_FIELD, hero.name);
cv.put(ICOID_FIELD, hero.icoId);
cv.put(ATTACK_FIELD, hero.attack);
cv.put(DEFENSE_FIELD, hero.defense);
db.insert(TABLE_NAME, null, cv);
}
/**
* 刪除記錄
* @param
*/
public void deleteData(int id) {
String whereClasuse = "_id = ?";
String[] whereArgs = new String[]{String.valueOf(id)};
db.delete(TABLE_NAME, whereClasuse, whereArgs);
}
/**
* 修改記錄
* @param hero
*/
public void updateData(Hero hero) {
ContentValues cv = new ContentValues();
cv.put(NAME_FIELD, hero.name);
cv.put(ICOID_FIELD, hero.icoId);
cv.put(ATTACK_FIELD, hero.attack);
cv.put(DEFENSE_FIELD, hero.defense);
String whereClasuse = "_id = ?";
String[] whereArgs = new String[]{String.valueOf(hero.id)};
db.update(TABLE_NAME, cv, whereClasuse, whereArgs);
}
/**
* 查詢所有的英雄
* @return
*/
public List<Hero> selectData() {
List<Hero> heroList = new ArrayList<>();
Cursor c = db.rawQuery("select * from "   TABLE_NAME, null);
while (c.moveToNext()) {
Hero hero = new Hero();
hero.id = c.getInt(c.getColumnIndex("_id"));
hero.name = c.getString(c.getColumnIndex(NAME_FIELD));
hero.icoId = c.getInt(c.getColumnIndex(ICOID_FIELD));
hero.attack = c.getInt(c.getColumnIndex(ATTACK_FIELD));
hero.defense = c.getInt(c.getColumnIndex(DEFENSE_FIELD));
heroList.add(hero);
}
c.close();
return heroList;
}
/**
* 按name查詢
* @param name
* @return
*/
public Hero selectForName(String name) {
Cursor c = db.rawQuery("select * from "   TABLE_NAME   " where name = ?", new String[]{name});
Hero hero = null;
if (c.moveToNext()) {
hero = new Hero();
hero.id = c.getInt(c.getColumnIndex("_id"));
hero.name = c.getString(c.getColumnIndex(NAME_FIELD));
hero.icoId = c.getInt(c.getColumnIndex(ICOID_FIELD));
hero.attack = c.getInt(c.getColumnIndex(ATTACK_FIELD));
hero.defense = c.getInt(c.getColumnIndex(DEFENSE_FIELD));
}
c.close();
return hero;
}
public void destroy() {
//    if (db != null) {
//      db.close();
//    }
//    db = null;
}
}

SQLiteDemo