Android開發中SQLite數據庫操作(一)

最近看了網上的關於Android SQLite數據庫的視頻教程,在這裏做個筆記記錄一下一些常用的操作,在文章最後會給出源碼。

孫子兵法有言:知己知彼方能百戰不殆,既然用sqlite,那我們首先先來了解一下什麼是sqlite?

首先嵌入式數據庫是不需要獨立運行有專門的數據庫引擎的,由程序直接調用相應的API實現對數據庫的存取操作,它是程序驅動式的,不同於SQLServer、DB2、MySQL、Oracle這些引擎響應式的。sqlite就是一款開源的輕量級的可嵌入的關係型數據庫,特點是系統開銷小(通常只需要幾百KB的內存就足夠了)、檢索效率高、應用範圍廣,sqlite不僅支持標準的SQL語法,還遵循了數據庫的ACID事務,保證了數據的完整性,同時也提高了運行的速度。下面先來看一些基礎知識:

1.sqlite數據庫的數據類型:Integer、varchar(10)、float、double、char(10)、text 

2.日常開發中較爲常用的sql語句:

創建表:create table 表名(字段名稱 數據類型 約束條件,字段名稱 數據類型 約束條件......) 

例如:create table person(_id Integer primary key,name varchar(10),age Integer not null)

刪除表:drop table 表名

例如:drop table person

插入數據:insert into 表名[字段,字段] values(值1,值2......)

例如:insert into person(_id,age) values(1,20)  表名後面指定了要插入的字段名稱,則values中根據字段名對應賦值即可

       insert into person values(2,"archie",24)   表名後面沒有指定具體要插入的字段名,則values中要根據表結構一一給出相應的值

修改表:update 表名 set 字段=新值 where 修改的條件

例如:update person set name="jarchie",age=23 where _id=2

刪除數據:delete from 表名 where 刪除的條件

例如:delete from person where _id=2

查詢語句:select 字段 from 表名 where 查詢條件 group by 分組的字段 having 篩選條件 order by 排序字段

例如:查詢所有:select * from person 

   模糊查詢:select * from person where name like "%小%"      select * from person where name like "_小%"

   排序:select * from person where age>18 order by _id

好了,瞭解了以上的知識點之後,我們一起來看一下sqlite數據庫在android中具體該如何使用呢?

首先來看如何創建數據庫?

Android底層爲我們提供了一個SQLiteOpenHelper的幫助類,裏面封裝了創建和使用數據庫的各種方法,我們只需要定義自己的類去繼承SQLiteOpenHelper,實現裏面的方法即可。

public class MySqliteHelper extends SQLiteOpenHelper
其中,onCreate()方法是在數據庫創建時回調的函數:

/**
 * 當數據庫創建時回調的函數
 * @param db 數據庫對象
 */
@Override
public void onCreate(SQLiteDatabase db) {
    Log.e(TAG, "onCreate: " + "------onCreate-----" );
}

然後,我們在我們的活動頁中首先需要拿到我們的MySqliteHelper對象,然後通過調用helper.getWriteableDatabase()方法就可以創建數據庫了:

helper = DbManager.getInstance(this);
/**
 * getReadableDatabase()和getWritableDatabase()創建或者打開數據庫
 * 如果數據庫不存在則創建數據庫,如果數據庫存在直接打開數據庫
 * 默認情況下兩個函數都表示打開或者創建可讀可寫的數據庫對象,如果磁盤已滿或者數據庫
 * 本身權限等情況下getReadableDatabase()打開的是隻讀數據庫
 */
SQLiteDatabase db = helper.getWritableDatabase();

接下來我們來看一下對數據庫的一些常用操作,在本篇中先來看一下sqlite的增刪改操作,對於這部分我們有兩種實現方式,一種是直接通過執行sql語句進行相關的操作,另一種是通過android中的api進行操作,下面先來看一下第一種實現方式:

首先定義一個數據庫的操作類,在該類中我們定義一個數據庫的公共的執行方法,便於調用:

/**
 * 根據sql語句在數據庫中執行語句
 * @param db 數據庫對象
 * @param sql sql語句
 */
public static void execSql(SQLiteDatabase db,String sql){
    if (db != null){
        if (!TextUtils.isEmpty(sql)){
            db.execSQL(sql);
        }
    }
}

然後在我們的頁面中開始進行相關的操作,分別是插入數據,修改數據,刪除數據等操作:

插入操作:

db = helper.getWritableDatabase();
String sql = "insert into "+ Constant.TABLE_NAME+" values(1,'Archie',24)";
DbManager.execSql(db,sql);
String sql1 = "insert into "+ Constant.TABLE_NAME+" values(2,'Jackson',25)";
DbManager.execSql(db,sql1);
db.close();

修改數據:

db = helper.getWritableDatabase();
String sql2 = "update "+Constant.TABLE_NAME+" set "+Constant.NAME
        +"='angel' where "+Constant._ID+"=1";
DbManager.execSql(db,sql2);
db.close();

刪除數據:

db = helper.getWritableDatabase();
String sql3 = "delete from "+Constant.TABLE_NAME+" where "+Constant._ID+"=2";
DbManager.execSql(db,sql3);
db.close();

通過這些操作我們就可以完成數據的增刪改功能,但是這種方式有個前提條件是我們得熟練的去運用sql語句。所以,下面我們來看看使用第二種方式該如何實現?

插入數據:

db = helper.getWritableDatabase();
/**
 * insert(String table, String nullColumnHack, ContentValues values)
 * table:表名 nullColumnHack:一般指定爲null values:鍵爲String的HashMap集合
 * return long 表示插入數據的列數
 */
ContentValues values = new ContentValues();
values.put(Constant._ID,3); //put(字段名,字段值)
values.put(Constant.NAME,"安奇");
values.put(Constant.AGE,24);
long result = db.insert(Constant.TABLE_NAME, null, values);
if (result > 0){
    DbManager.toastMessage(this,"插入數據成功!");
}else {
    DbManager.toastMessage(this,"插入數據失敗!");
}
db.close();
修改數據:

db = helper.getWritableDatabase();
/**
 * update(String table, ContentValues values, String whereClause, String[] whereArgs)
 * table:表名 values:鍵爲String的HashMap集合
 * whereClause:表示當前修改的條件 whereArgs:修改條件的佔位符
 * return int 修改的條數
 */
ContentValues values1 = new ContentValues();
values1.put(Constant.NAME,"哈哈"); //put(需要修改的字段名,修改後的字段值)
int count = db.update(Constant.TABLE_NAME, values1, Constant._ID + "=?",
        new String[]{"3"});
if (count > 0){
    DbManager.toastMessage(this,"修改數據成功!");
}else {
    DbManager.toastMessage(this,"修改數據失敗!");
}
db.close();

刪除數據:

db = helper.getWritableDatabase();
/**
 * delete(String table, String whereClause, String[] whereArgs)
 * table:刪除的表名 whereClause:刪除的條件 whereArgs:刪除條件的佔位符
 * return int 刪除條數
 */
int size = db.delete(Constant.TABLE_NAME, Constant._ID + "=?", new String[]{"1"});
if (size > 0){
    DbManager.toastMessage(this,"刪除數據成功!");
}else {
    DbManager.toastMessage(this,"刪除數據失敗!");
}
db.close();
附項目源碼如下:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/create_db"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:text="創建數據庫"
        android:textColor="#fff"
        android:background="#f37400"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="14dp"/>

    <Button
        android:id="@+id/insert_db"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:text="插入數據"
        android:textColor="#fff"
        android:background="#f37400"
        android:layout_marginLeft="14dp"
        android:layout_marginTop="10dp"/>

    <Button
        android:id="@+id/update_db"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:text="修改數據"
        android:textColor="#fff"
        android:background="#f37400"
        android:layout_marginLeft="14dp"
        android:layout_marginTop="10dp"/>

    <Button
        android:id="@+id/delete_db"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:text="刪除數據"
        android:textColor="#fff"
        android:background="#f37400"
        android:layout_marginLeft="14dp"
        android:layout_marginTop="10dp"/>

    <Button
        android:id="@+id/insertapi_db"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:text="api插入數據"
        android:textColor="#fff"
        android:background="#f37400"
        android:layout_marginLeft="14dp"
        android:layout_marginTop="10dp"/>

    <Button
        android:id="@+id/updateapi_db"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:text="api修改數據"
        android:textColor="#fff"
        android:background="#f37400"
        android:layout_marginLeft="14dp"
        android:layout_marginTop="10dp"/>

    <Button
        android:id="@+id/deleteapi_db"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:text="api刪除數據"
        android:textColor="#fff"
        android:background="#f37400"
        android:layout_marginLeft="14dp"
        android:layout_marginTop="10dp"/>

</LinearLayout>
Constant.java

package com.jarchie.sqliteproject.db;

/**
 * Created by Jarchie on 17/1/7.
 * 創建數據庫參數的常量類
 */

public class Constant {
    public static final String DATABASE_NAME = "info.db"; //數據庫名稱
    public static final int DATABASE_VERSION = 1; //數據庫的版本號
    public static final String TABLE_NAME = "person"; //表名
    public static final String _ID = "_id";
    public static final String NAME = "name";
    public static final String AGE = "age";
}
MySqliteHelper.java

package com.jarchie.sqliteproject.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

/**
 * Created by Jarchie on 17/1/7.
 * 本類提供了創建數據庫和更新數據庫的方法
 * 提供了獲取數據庫對象的函數
 */

public class MySqliteHelper extends SQLiteOpenHelper{
    private static final String TAG = "MySqliteHelper";

    /**
     * 構造函數
     * @param context 上下文對象
     * @param name 表示創建的數據庫的名稱
     * @param factory 遊標工廠
     * @param version 當前創建數據庫的版本,要求>=1
     */
    public MySqliteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    public MySqliteHelper(Context context){
        super(context,Constant.DATABASE_NAME,null,Constant.DATABASE_VERSION);
    }

    /**
     * 當數據庫創建時回調的函數
     * @param db 數據庫對象
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.e(TAG, "onCreate: " + "------onCreate-----" );
        String sql = "create table "+Constant.TABLE_NAME+"("+
                Constant._ID+" Integer primary key,"+Constant.NAME+
                " varchar(10),"+Constant.AGE+" Integer)";
        db.execSQL(sql); //執行sql語句
    }

    /**
     * 當數據庫版本更新時回調的函數
     * @param db 數據庫對象
     * @param oldVersion 數據庫舊版本
     * @param newVersion 數據庫新版本
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.e(TAG, "onUpgrade: " + "------onUpgrade-----" );
    }

    /**
     * 當數據庫打開時回調的函數
     * @param db 數據庫對象
     */
    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
        Log.e(TAG, "onOpen: " + "------onOpen-----" );
    }

}
DbManager.java

package com.jarchie.sqliteproject.utils;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.text.TextUtils;
import android.widget.Toast;
import com.jarchie.sqliteproject.db.MySqliteHelper;

/**
 * Created by Jarchie on 17/1/7.
 * 對數據庫操作的工具類,降低代碼的耦合度
 */

public class DbManager {
    /**
     * 採用單例模式構建helper對象
     */
    private static MySqliteHelper helper;
    public static MySqliteHelper getInstance(Context context){
        if (helper == null){
            helper = new MySqliteHelper(context);
        }
        return helper;
    }

    /**
     * 根據sql語句在數據庫中執行語句
     * @param db 數據庫對象
     * @param sql sql語句
     */
    public static void execSql(SQLiteDatabase db,String sql){
        if (db != null){
            if (!TextUtils.isEmpty(sql)){
                db.execSQL(sql);
            }
        }
    }

    /**
     * 定義公共的吐司方法
     * @param context 上下文對象
     * @param message 吐司信息
     */
    public static void toastMessage(Context context,String message){
        Toast.makeText(context,message,Toast.LENGTH_SHORT).show();
    }

}
MainActivity.java

package com.jarchie.sqliteproject;

import android.app.Activity;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.jarchie.sqliteproject.db.Constant;
import com.jarchie.sqliteproject.db.MySqliteHelper;
import com.jarchie.sqliteproject.utils.DbManager;

public class MainActivity extends Activity implements View.OnClickListener{
    private Button createBtn,insertBtn,updateBtn,deleteBtn,apiinsertBtn,apiupdateBtn,apideleteBtn;
    private MySqliteHelper helper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        helper = DbManager.getInstance(this);
        initView();
        initWidgetListener();
    }

    /**
     * 初始化控件
     */
    private void initView(){
        createBtn = (Button) findViewById(R.id.create_db);
        insertBtn = (Button) findViewById(R.id.insert_db);
        updateBtn = (Button) findViewById(R.id.update_db);
        deleteBtn = (Button) findViewById(R.id.delete_db);
        apiinsertBtn = (Button) findViewById(R.id.insertapi_db);
        apiupdateBtn = (Button) findViewById(R.id.updateapi_db);
        apideleteBtn = (Button) findViewById(R.id.deleteapi_db);
    }

    /**
     * 初始化監聽事件
     */
    private void initWidgetListener(){
        createBtn.setOnClickListener(this);
        insertBtn.setOnClickListener(this);
        updateBtn.setOnClickListener(this);
        deleteBtn.setOnClickListener(this);
        apiinsertBtn.setOnClickListener(this);
        apiupdateBtn.setOnClickListener(this);
        apideleteBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.create_db:
                createDb();
                break;
            case R.id.insert_db:
                insertData();
                break;
            case R.id.update_db:
                updateData();
                break;
            case R.id.delete_db:
                deleteData();
                break;
            case R.id.insertapi_db:
                apiInsertData();
                break;
            case R.id.updateapi_db:
                apiUpdateData();
                break;
            case R.id.deleteapi_db:
                apiDeleteData();
                break;
        }
    }

    //創建數據庫
    private void createDb(){
        /**
         * getReadableDatabase()和getWritableDatabase()創建或者打開數據庫
         * 如果數據庫不存在則創建數據庫,如果數據庫存在直接打開數據庫
         * 默認情況下兩個函數都表示打開或者創建可讀可寫的數據庫對象,如果磁盤已滿或者數據庫
         * 本身權限等情況下getReadableDatabase()打開的是隻讀數據庫
         */
        SQLiteDatabase db = helper.getWritableDatabase();
    }

    //sql語句插入數據
    private void insertData(){
        SQLiteDatabase db = helper.getWritableDatabase();
        String sql = "insert into "+ Constant.TABLE_NAME+" values(1,'Archie',24)";
        DbManager.execSql(db,sql);
        String sql1 = "insert into "+ Constant.TABLE_NAME+" values(2,'Jackson',25)";
        DbManager.execSql(db,sql1);
        db.close();
    }

    //sql語句修改數據
    private void updateData(){
        SQLiteDatabase db = helper.getWritableDatabase();
        String sql2 = "update "+Constant.TABLE_NAME+" set "+Constant.NAME
                +"='angel' where "+Constant._ID+"=1";
        DbManager.execSql(db,sql2);
        db.close();
    }

    //sql語句刪除數據
    private void deleteData(){
        SQLiteDatabase db = helper.getWritableDatabase();
        String sql3 = "delete from "+Constant.TABLE_NAME+" where "+Constant._ID+"=2";
        DbManager.execSql(db,sql3);
        db.close();
    }

    //api插入數據
    private void apiInsertData(){
        SQLiteDatabase db = helper.getWritableDatabase();
        /**
         * insert(String table, String nullColumnHack, ContentValues values)
         * table:表名 nullColumnHack:一般指定爲null values:鍵爲String的HashMap集合
         * return long 表示插入數據的列數
         */
        ContentValues values = new ContentValues();
        values.put(Constant._ID,3); //put(字段名,字段值)
        values.put(Constant.NAME,"安奇");
        values.put(Constant.AGE,24);
        long result = db.insert(Constant.TABLE_NAME, null, values);
        if (result > 0){
            DbManager.toastMessage(this,"插入數據成功!");
        }else {
            DbManager.toastMessage(this,"插入數據失敗!");
        }
        db.close();
    }

    //api修改數據
    private void apiUpdateData(){
        SQLiteDatabase db = helper.getWritableDatabase();
        /**
         * update(String table, ContentValues values, String whereClause, String[] whereArgs)
         * table:表名 values:鍵爲String的HashMap集合
         * whereClause:表示當前修改的條件 whereArgs:修改條件的佔位符
         * return int 修改的條數
         */
        ContentValues values1 = new ContentValues();
        values1.put(Constant.NAME,"哈哈"); //put(需要修改的字段名,修改後的字段值)
//                int count = db.update(Constant.TABLE_NAME, values1,
//                      Constant._ID + "=3", null);
        int count = db.update(Constant.TABLE_NAME, values1, Constant._ID + "=?",
                new String[]{"3"});
        if (count > 0){
            DbManager.toastMessage(this,"修改數據成功!");
        }else {
            DbManager.toastMessage(this,"修改數據失敗!");
        }
        db.close();
    }

    //api刪除數據
    private void apiDeleteData(){
        SQLiteDatabase db = helper.getWritableDatabase();
        /**
         * delete(String table, String whereClause, String[] whereArgs)
         * table:刪除的表名 whereClause:刪除的條件 whereArgs:刪除條件的佔位符
         * return int 刪除條數
         */
        int size = db.delete(Constant.TABLE_NAME, Constant._ID + "=?", new String[]{"1"});
        if (size > 0){
            DbManager.toastMessage(this,"刪除數據成功!");
        }else {
            DbManager.toastMessage(this,"刪除數據失敗!");
        }
        db.close();
    }

}
好了,本篇就先寫到這裏,未完待續哦!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章