Android 中使用 SQLite 資料庫

YunSoul發表於2018-08-22

一、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 的子類,至少需要實現三個方法:

  1. 建構函式,呼叫父類 SQLiteOpenHelper 的建構函式。這個方法需要四個引數:上下文環境,資料庫名字,一個可選的遊標工廠(通常是 Null),一個代表正在使用的資料庫模型版本的整數。
  2. onCreate()方法,當資料庫第一次被建立的時候被執行,一般把建立表,初始化資料等操作放在這裡。
  3. 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資料庫使用

  1. 建立一個DatabaseHelper 類,繼承SQLiteOpenHelper,並在實現的方法中初始化,比如建立資料庫等;
  2. 獲取DatabaseHelper 的物件,並建立或開啟一個可以讀的資料庫;
  3. 此時可以在開啟的資料庫中執行相應操作,如增、刪、改、查操作等;

【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技術分享,掃碼關注微信公眾號##
    ——只要你學會了之前所不會的東西,只要今天的你強過了昨天的你,那你就一直是在進階的路上了。 Android 中使用 SQLite 資料庫

相關文章