Android SQLlite數據庫簡單總結

 SQLiteOpenHelper類 常用方法

/** 
  *  創建數據庫
  */ 
 // 1. 創建 or 打開 可讀/寫的數據庫(通過 返回的SQLiteDatabase對象 進行操作)
 getWritableDatabase()

 // 2. 創建 or 打開 可讀的數據庫(通過 返回的SQLiteDatabase對象 進行操作)
 getReadableDatabase()

 // 3. 數據庫第1次創建時 則會調用,即 第1次調用 getWritableDatabase() / getReadableDatabase()時調用
 // 在繼承SQLiteOpenHelper類的子類中複寫
 onCreate(SQLiteDatabase db) 

 // 4. 數據庫升級時自動調用
 // 在繼承SQLiteOpenHelper類的子類中複寫
 onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

 // 5. 關閉數據庫
 close()

 /** 
  *  數據庫操作(增、刪、減、查)
  */ 
 // 1. 查詢數據
 (Cursor) query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)  
 // 查詢指定的數據表返回一個帶遊標的數據集。
 // 各參數說明: 
 // table:表名稱 
 // colums:列名稱數組 
 // selection:條件子句,相當於where 
 // selectionArgs:條件語句的參數數組 
 // groupBy:分組 
 // having:分組條件 
 // orderBy:排序類 
 // limit:分頁查詢的限制 
 // Cursor:返回值,相當於結果集ResultSet 

 (Cursor) rawQuery(String sql, String[] selectionArgs) 
 //運行一個預置的SQL語句,返回帶遊標的數據集(與上面的語句最大的區別 = 防止SQL注入)

 // 2. 刪除數據行  
 (int) delete(String table,String whereClause,String[] whereArgs) 
 
 // 3. 添加數據行 
 (long) insert(String table,String nullColumnHack,ContentValues values) 
 
 // 4. 更新數據行 
(int) update(String table, ContentValues values, String whereClause, String[] whereArgs) 
 
 // 5. 執行一個SQL語句,可以是一個select or 其他sql語句 
 // 即 直接使用String類型傳入sql語句 & 執行
 (void) execSQL(String sql) 

DataBaseHelper.java文件,繼承SQLiteOpenHelper

package com.chy.sqlite.DataBase;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class DataBaseHelper extends SQLiteOpenHelper {
    private static final int DATABASE_VERSION = 1; //數據庫版本號

    /**
     * 構造函數
     * 在SQLiteOpenHelper的子類中,必須有該構造函數
     */
    public DataBaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory,
                          int version) {
        // 參數說明
        // context:上下文對象
        // name:數據庫名稱
        // factory:一個可選的遊標工廠(通常是 Null)
        // version:當前數據庫的版本,值必須是整數並且是遞增的狀態

        // 必須通過super調用父類的構造函數
        super(context, name, factory, version);
    }

    /**
     * 自定義構造函數
     * */
    public DataBaseHelper(@Nullable Context context, @Nullable String name) {
        super(context, name+".db", null, DATABASE_VERSION);
    }


    /**
     * 複寫onCreate()
     * 調用時刻:當數據庫第1次創建時調用
     * 作用:創建數據庫 表 & 初始化數據
     * SQLite數據庫創建支持的數據類型: 整型數據、字符串類型、日期類型、二進制
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 創建數據庫1張表
        // 通過execSQL()執行SQL語句(此處創建了1個名爲person的表)
        String sql = "create table person(id integer primary key autoincrement,name varchar(64),address varchar(64))";
        db.execSQL(sql);

        // 注:數據庫實際上是沒被創建 / 打開的(因該方法還沒調用)
        // 直到getWritableDatabase() / getReadableDatabase() 第一次被調用時纔會進行創建 / 打開
    }

    /**
     * 複寫onUpgrade()
     * 調用時刻:當數據庫升級時則自動調用(即 數據庫版本 發生變化時)
     * 作用:更新數據庫表結構
     * 注:創建SQLiteOpenHelper子類對象時,必須傳入一個version參數,
     * 該參數 = 當前數據庫版本, 若該版本高於之前版本, 就調用onUpgrade()
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 參數說明:
        // db : 數據庫
        // oldVersion : 舊版本數據庫
        // newVersion : 新版本數據庫
        // 使用 SQL的ALTER語句

        // 向person表中新增 sex 屬性
        String sql = "alter table person add sex varchar(8)";
        db.execSQL(sql);
    }
}

DataBaseManager.java

package com.chy.sqlite.DataBase;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import java.util.ArrayList;
import java.util.HashMap;

public class DataBaseManager {

    DataBaseHelper dbHelper;
    SQLiteDatabase sqLiteDatabase;

    /**
     * Context 上下文
     * DBName 數據庫名
     * */
    public DataBaseManager(Context context, String DBName){
        dbHelper = new DataBaseHelper(context, DBName);
        // 創建 or 打開 可讀的數據庫(通過 返回的SQLiteDatabase對象 進行操作)
        //sqLiteDatabase = dbHelper.getReadableDatabase();// 只有查找(讀取)權限

        // 創建 or 打開 可讀/寫的數據庫(通過 返回的SQLiteDatabase對象 進行操作)
        sqLiteDatabase = dbHelper.getWritableDatabase();// 增、刪、改、查權限
    }


    /**
     * 【插入數據】
     * */
        public void insertDataToDB(){
            // 創建ContentValues對象
            ContentValues values = new ContentValues();

            /** 向該對象中插入鍵值對
            * 其中,key = 列名,value = 插入的值
            * 注:CContentValues 和HashTable類似都是一種存儲的機制
             * 但是兩者最大的區別就在於,
             * contenvalues只能存儲基本類型的數據,
             * 像string,int之類的,不能存儲對象這種東西,而HashTable卻可以存儲對象*/
            values.put("name", "測試");
            values.put("address", "長春");

            // 參數1:要操作的表名稱
            // 參數2:SQl不允許一個空列,若ContentValues是空,那麼這一列被明確的指明爲NULL值
            // 參數3:ContentValues對象
           // sqLiteDatabase.insert("person", null, values);

            // 注:也可採用SQL語句插入
            String sql = "insert into person (name,address) values ('test','cc')";
            sqLiteDatabase.execSQL(sql);
        }


        /**
         * 【刪除數據】
         *
         * */
        public void deleateToDB(){
            // 參數1:表名(String)
            // 參數2:WHERE表達式(String),需刪除數據的行; 若該參數爲 null, 就會刪除所有行;?號是佔位符
            // 參數3:WHERE選擇語句的參數(String[]), 逐個替換 WHERE表達式中 的“?”佔位符;
            // 刪除 id = 1的數據
           // sqLiteDatabase.delete("person", "id=?", new String[]{"1"});


            // 注:也可採用SQL語句修改
            String sql = "delete from person where id='4'";
            sqLiteDatabase.execSQL(sql);
        }

        /**
         * 【更新數據】
         * */
        public void updataToDB(){
            // 創建一個ContentValues對象
            ContentValues values = new ContentValues();
            values.put("name", "lisi");

            // 參數1:表名(String)
            // 參數2:需修改的ContentValues對象
            // 參數3:WHERE表達式(String),需數據更新的行; 若該參數爲 null, 就會修改所有行;?號是佔位符
            // 參數4:WHERE選擇語句的參數(String[]), 逐個替換 WHERE表達式中 的“?”佔位符;
            //調用update方法修改數據庫:將id=1 修改成 name = zhangsan
           // sqLiteDatabase.update("person", values, "id=?", new String[] { "2" });

            // 注:也可採用SQL語句修改
            String sql = "update person set name = 'lisi' where id='5'";
            sqLiteDatabase.execSQL(sql);
        }


    /**
     * 【查詢數據】
     * */
        public void queryDataFromDB(){
            ArrayList<HashMap<String ,String>> list = new ArrayList<>();
            // 參數1:(String)表名
            // 參數2:(String[])要查詢的列名
            // 參數3:(String)查詢條件
            // 參數4:(String[])查詢條件的參數
            // 參數5:(String)對查詢的結果進行分組
            // 參數6:(String)對分組的結果進行限制
            // 參數7:(String)對查詢的結果進行排序
            Cursor cursor = sqLiteDatabase.query("person", new String[] {"id", "name", "address"} , "id = ?", new String[]{"2"}, null, null, null);
            int cur_len = cursor.getColumnCount();//獲取數據所有列數

            while (cursor.moveToNext()){
                HashMap<String , String> map = new HashMap<>();
                for (int i=0; i<cur_len; i++){
                    String clos_name = cursor.getColumnName(i);//從給定的索引i返回列名
                    String clos_value = cursor.getString(cursor.getColumnIndex(clos_name));//返回指定的名稱,沒有就返回-1
                    if(clos_value==null){
                        clos_value = "";
                    }
                    Log.i("TAG:","while循環下面的for循環拿到的數據clos_value爲:"
                            + cursor.getString(cursor.getColumnIndex(clos_name)));
                    map.put(clos_name , clos_value);
                }
                list.add(map);
            }
        }

        /**
         * 【關閉數據庫】
         * */
        public void closeDB(){
            /**注:完成數據庫操作後,記得調用close()關閉數據庫,從而釋放數據庫的連接*/
            sqLiteDatabase.close();
        }

        /**
         * 【自增列清零】
         * */
        private void clearSqlite_sequenceFromDB(){
            // 將自增id列清零,重新計算
            String sql = "update sqlite_sequence set seq=0 where name = 'person'";
            sqLiteDatabase.execSQL(sql);
        }
}

使用方法:

package com.chy.sqlite;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.chy.sqlite.DataBase.DataBaseManager;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button addBtn;
    private Button delBtn;
    private Button updataBtn;
    private Button queryBtn;

    private DataBaseManager dataBaseManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 新增數據
        addBtn = findViewById(R.id.addBtn);
        addBtn.setOnClickListener(this);
        // 刪除數據
        delBtn = findViewById(R.id.delBtn);
        delBtn.setOnClickListener(this);
        // 更新數據
        updataBtn = findViewById(R.id.updataBtn);
        updataBtn.setOnClickListener(this);
        // 查找數據
        queryBtn = findViewById(R.id.queryBtn);
        queryBtn.setOnClickListener(this);

        dataBaseManager = new DataBaseManager(this, "test");
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.addBtn:
                    dataBaseManager.insertDataToDB();
                break;
            case R.id.delBtn:
                    dataBaseManager.deleateToDB();
                break;
            case R.id.updataBtn:
                    dataBaseManager.updataToDB();
                break;
            case R.id.queryBtn:
                    dataBaseManager.queryDataFromDB();
                break;
        }
    }
}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章