一、Android 中SQLite 介紹
Android 在執行時(run-time)整合了 SQLite,所以每個 Android 應用程式都可以使用 SQLite 資料庫。
由於JDBC(Java DataBase Connectivity,java資料庫連線)是一種用於執行SQL語句的Java API,會消耗太多的系統資源,對於手機這種記憶體受限裝置來說並不合適。因此Android 提供了一些新的 API 來使用 SQLite 資料庫。
資料庫儲存在 data/data/< 專案資料夾 >/databases/ 下。
複製程式碼
二、Android 中SQLite資料庫使用
2.1 建立資料庫
在 Android 應用程式中使用 SQLite,必須自己建立資料庫,然後建立表、索引,填充資料。Android 提供了 SQLiteOpenHelper 幫助建立一個資料庫,只要繼承 SQLiteOpenHelper 類,就可以輕鬆的建立資料庫。
SQLiteOpenHelper 類根據開發應用程式的需要,封裝了建立和更新資料庫使用的邏輯。SQLiteOpenHelper 的子類,至少需要實現三個方法:
- 建構函式,呼叫父類 SQLiteOpenHelper 的建構函式。這個方法需要四個引數:上下文環境,資料庫名字,一個可選的遊標工廠(通常是 Null),一個代表正在使用的資料庫模型版本的整數。
- onCreate()方法,當資料庫第一次被建立的時候被執行,一般把建立表,初始化資料等操作放在這裡。
- onUpgrage() 方法,當資料庫版本更新時會自動執行。
public class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version)
{
super(context, name, cursorFactory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO 建立資料庫後,對資料庫的操作
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO 更改資料庫版本的操作
}
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
// TODO 每次成功開啟資料庫後首先被執行
}
}
複製程式碼
2.2 SQLite資料庫使用
- 建立一個DatabaseHelper 類,繼承SQLiteOpenHelper,並在實現的方法中初始化,比如建立資料庫等;
- 獲取DatabaseHelper 的物件,並建立或開啟一個可以讀的資料庫;
- 此時可以在開啟的資料庫中執行相應操作,如增、刪、改、查操作等;
【SqliteDbHelper類】
package com.soul.ijreceiver;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* 模組:
* 作者:soul
* 時間:2018/8/30:13:59
* 說明:
*/
public class SqliteDbHelper extends SQLiteOpenHelper
{
private static final int DB_VERSION = 1;
private static final String DB_NAME = "soul.db";
public static final String TABLE_NAME = "person";
public SqliteDbHelper(Context context)
{
super(context, DB_NAME, null, DB_VERSION);
}
/**
* 呼叫時刻:當資料庫第1次建立時呼叫
* 作用:建立資料庫 表 & 初始化資料
* SQLite資料庫建立支援的資料型別: 整型資料、字串型別、日期型別、二進位制
*/
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase)
{
String createTbStr = "create table if not exists "+TABLE_NAME+"( _id integer primary key, name varchar, age integer, sex varchar)";
sqLiteDatabase.execSQL(createTbStr);
// 注:資料庫實際上是沒被建立 / 開啟的(因該方法還沒呼叫)
// 直到getWritableDatabase() / getReadableDatabase() 第一次被呼叫時才會進行建立 / 開啟
}
/**
* 呼叫時刻:當資料庫升級時則自動呼叫(即 資料庫版本 發生變化時)
* 作用:更新資料庫表結構
* 注:建立SQLiteOpenHelper子類物件時,必須傳入一個version引數,該引數 = 當前資料庫版本, 若該版本高於之前版本, 就呼叫onUpgrade()
*/
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1)
{
//可重新建表
sqLiteDatabase.execSQL("drop table if exists "+TABLE_NAME);
onCreate(sqLiteDatabase);
//也可在表中新增列元素, 使用 SQL的ALTER語句
String sql = "alter table "+TABLE_NAME+" add job varchar";
sqLiteDatabase.execSQL(sql);
}
}
複製程式碼
【SqliteDbManager類:SQLiteOpenHelper的工具類(可開啟資料庫,執行增刪改查操作)】
package com.soul.ijreceiver;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
/**
* 模組:資料庫
* 作者:soul
* 時間:2018/8/30:14:32
* 說明:
*/
public class SqliteDbManager
{
private static SqliteDbManager mInstance = null;
private SQLiteDatabase mDb = null;
private SqliteDbHelper mDbHelper = null;
public static SqliteDbManager getInstance()
{
if (mInstance == null)
{
mInstance = new SqliteDbManager();
}
return mInstance;
}
public void setSqliteDbOpen(Context context)
{
mDbHelper = new SqliteDbHelper(context.getApplicationContext());
mDb = mDbHelper.getWritableDatabase();
}
public void insertTb(String tbName)
{
openDb();
//方法一:
ContentValues contentValues = new ContentValues();
contentValues.put("name","zhangsan");
contentValues.put("age",18);
contentValues.put("sex","男");
mDb.insert(tbName,null,contentValues);
//方法二:
mDb.execSQL("insert into "+tbName+" (name,age,sex) values ('李四',20,'女')");
mDb.execSQL("insert into "+tbName+" (name,age,sex) values ('王五',22,'女')");
mDb.execSQL("insert into "+tbName+" (name,age,sex) values ('哈利',21,'男')");
closeDb();
}
public void deleteTb(String tbName)
{
openDb();
//方法一:
mDb.delete(tbName,"name=?",new String[]{"zhangsan"});
//方法二:
mDb.execSQL("delete from "+tbName+" where name = '李四'");
closeDb();
}
public void updateTb(String tbName)
{
openDb();
//方法一:
ContentValues contentValues = new ContentValues();
contentValues.put("name","隔壁老王");
contentValues.put("sex","男");
mDb.update(tbName,contentValues,"name=?",new String[]{"王五"});
//方法二:
mDb.execSQL("update "+tbName+" set name = '哈利波特',age = '16' where name = '哈利'");
closeDb();
}
public void queryTb(String tbName)
{
openDb();
//方法一:
Cursor cursor = mDb.query(tbName, new String[]{"name","sex","age"}, "name=?", new String[]{"隔壁老王"}, null, null, null);
//將游標移動到下一行,從而判斷該結果集是否還有下一條資料;如果有則返回true,沒有則返回false
if (null != cursor)
{
while (cursor.moveToNext())
{
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
String sex = cursor.getString(cursor.getColumnIndex("sex"));
Log.i("????","name = "+name+"; age = "+age+"; sex = "+sex);
}
cursor.close();
}
//方法二:使用sql語句
Cursor rawQuery = mDb.rawQuery("select * from " + tbName+" where name=?", new String[]{"哈利波特"});
if (null != rawQuery)
{
while (rawQuery.moveToNext())
{
String _id = rawQuery.getString(rawQuery.getColumnIndex("_id"));
String name = rawQuery.getString(rawQuery.getColumnIndex("name"));
int age = rawQuery.getInt(rawQuery.getColumnIndex("age"));
String sex = rawQuery.getString(rawQuery.getColumnIndex("sex"));
Log.i("????","_id = "+_id+"; name = "+name+"; age = "+age+"; sex = "+sex);
}
rawQuery.close();
}
closeDb();
}
/**
* 建立或開啟一個可以讀的資料庫
*/
private void openDb() {
if (this.mDbHelper != null) {
try {
mDb = mDbHelper.getWritableDatabase();
} catch (Exception e) {
mDb = mDbHelper.getReadableDatabase();
e.printStackTrace();
}
}
}
/**
* 關閉資料庫
*/
private void closeDb() {
try {
if (mDb != null) {
mDb.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
複製程式碼
下一篇:分享對SQLite資料封裝的心得。
#### YunSoul技術分享,掃碼關注微信公眾號##
-
——只要你學會了之前所不會的東西,只要今天的你強過了昨天的你,那你就一直是在進階的路上了。