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;
}
}
}