聊聊SQLite-輕量級(jí)關(guān)系型數(shù)據(jù)庫(kù)
SQLite介紹
SQLite 是一種輕量級(jí)的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它被設(shè)計(jì)為嵌入式數(shù)據(jù)庫(kù),不需要獨(dú)立的服務(wù)器進(jìn)程,可以直接訪問(wèn)存儲(chǔ)在文件中的數(shù)據(jù)庫(kù)。SQLite 在移動(dòng)設(shè)備、嵌入式系統(tǒng)以及小型應(yīng)用程序中被廣泛使用,它具有簡(jiǎn)單、快速、可靠的特點(diǎn)。SQLite 使用 SQL 語(yǔ)言進(jìn)行數(shù)據(jù)庫(kù)操作,支持大部分標(biāo)準(zhǔn)的 SQL 語(yǔ)法。
在使用 SQLite 時(shí),可以通過(guò) SQL 語(yǔ)句來(lái)創(chuàng)建、查詢、更新和刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù)。同時(shí),SQLite 也支持事務(wù)處理、觸發(fā)器、視圖等數(shù)據(jù)庫(kù)特性,使得它在小型應(yīng)用程序中也能滿足一定的復(fù)雜需求。
Android中的SQLite是一種輕量級(jí)的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它被廣泛用于Android應(yīng)用程序中存儲(chǔ)和管理數(shù)據(jù)。SQLite數(shù)據(jù)庫(kù)以單個(gè)文件的形式存儲(chǔ)在設(shè)備的內(nèi)部存儲(chǔ)器上,可以通過(guò)SQL語(yǔ)句進(jìn)行數(shù)據(jù)的增刪改查操作。
SQLite使用
SQLite是一種輕量級(jí)的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它被設(shè)計(jì)為嵌入式數(shù)據(jù)庫(kù),可以在各種操作系統(tǒng)上運(yùn)行。SQLite的特點(diǎn)包括零配置、無(wú)服務(wù)器、支持事務(wù)等。它通常用于移動(dòng)設(shè)備、嵌入式系統(tǒng)以及小型應(yīng)用程序中。
通常要使用SQLite,需要通過(guò)以下步驟操作:
- 下載SQLite:可以從官方網(wǎng)站下載SQLite的最新版本,也可以通過(guò)包管理工具安裝SQLite。
- 創(chuàng)建數(shù)據(jù)庫(kù):使用SQLite命令行工具或者SQLite的API來(lái)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)文件。
- 連接數(shù)據(jù)庫(kù):通過(guò)命令行工具或者編程語(yǔ)言的API來(lái)連接到數(shù)據(jù)庫(kù)。
- 執(zhí)行SQL語(yǔ)句:使用SQL語(yǔ)句來(lái)創(chuàng)建表、插入數(shù)據(jù)、查詢數(shù)據(jù)等操作。
- 斷開連接:在完成操作后,記得斷開與數(shù)據(jù)庫(kù)的連接。
SQLite的SQL語(yǔ)句和常規(guī)的關(guān)系型數(shù)據(jù)庫(kù)類似,但也有一些特有的語(yǔ)法和功能。在使用SQLite時(shí),需要注意其特有的限制和特性,比如數(shù)據(jù)類型的靈活性和事務(wù)處理的支持等。
在Android開發(fā)中,可以使用SQLite作為本地?cái)?shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)。以下是使用SQLite的基本步驟:
- 創(chuàng)建數(shù)據(jù)庫(kù):在SQLiteOpenHelper類中創(chuàng)建數(shù)據(jù)庫(kù),并定義表格結(jié)構(gòu)和初始化數(shù)據(jù)。
public class DBHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "mydatabase.db";
private static final int DATABASE_VERSION = 1;
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// 創(chuàng)建表格
db.execSQL("CREATE TABLE IF NOT EXISTS mytable (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT);");
// 初始化數(shù)據(jù)
db.execSQL("INSERT INTO mytable (name) VALUES ('John');");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 升級(jí)數(shù)據(jù)庫(kù)時(shí)的操作
}
}
- 執(zhí)行數(shù)據(jù)庫(kù)操作:使用SQLiteDatabase類執(zhí)行數(shù)據(jù)庫(kù)操作,如插入、更新、刪除和查詢數(shù)據(jù)。
DBHelper dbHelper = new DBHelper(context);
SQLiteDatabase db = dbHelper.getWritableDatabase();
// 插入數(shù)據(jù)
ContentValues values = new ContentValues();
values.put("name", "Alice");
db.insert("mytable", null, values);
// 查詢數(shù)據(jù)
Cursor cursor = db.query("mytable", new String[]{"_id", "name"}, null, null, null, null, null);
while (cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex("_id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
// 處理數(shù)據(jù)
}
// 關(guān)閉數(shù)據(jù)庫(kù)連接
db.close();
- 注意事項(xiàng):在使用SQLite時(shí),需要注意線程安全、數(shù)據(jù)類型、SQL注入等安全性問(wèn)題,以及數(shù)據(jù)庫(kù)版本升級(jí)時(shí)的處理。
SQLite數(shù)據(jù)庫(kù)升級(jí)
public class DBHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "mydatabase.db";
private static final int DATABASE_VERSION = 2;
// 構(gòu)造函數(shù)
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
// 創(chuàng)建表
@Override
public void onCreate(SQLiteDatabase db) {
String createTableQuery = "CREATE TABLE mytable (id INTEGER PRIMARY KEY, name TEXT)";
db.execSQL(createTableQuery);
}
// 升級(jí)數(shù)據(jù)庫(kù)
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < 2) {
// 添加新表
String createNewTableQuery = "CREATE TABLE newtable (id INTEGER PRIMARY KEY, age INTEGER)";
db.execSQL(createNewTableQuery);
}
if (oldVersion < 3) {
// 添加新字段
String addNewColumnQuery = "ALTER TABLE mytable ADD COLUMN email TEXT";
db.execSQL(addNewColumnQuery);
}
}
}
在上面的示例中,我們創(chuàng)建了一個(gè)名為mydatabase.db的數(shù)據(jù)庫(kù),并指定版本號(hào)為2。在onCreate方法中,我們創(chuàng)建了一個(gè)名為mytable的表。在onUpgrade方法中,我們檢查舊版本號(hào),如果舊版本號(hào)小于2,則添加一個(gè)名為newtable的新表;如果舊版本號(hào)小于3,則向mytable表中添加一個(gè)名為email的新字段。當(dāng)你的應(yīng)用程序升級(jí)時(shí),數(shù)據(jù)庫(kù)結(jié)構(gòu)也會(huì)相應(yīng)地進(jìn)行升級(jí)。
SQLite事務(wù)操作
數(shù)據(jù)庫(kù)事務(wù)是指作為單個(gè)邏輯工作單元執(zhí)行的一系列操作,要么全部成功執(zhí)行,要么全部不執(zhí)行。在數(shù)據(jù)庫(kù)中,事務(wù)具有以下四個(gè)特性,通常稱為ACID特性:
- 原子性(Atomicity):事務(wù)中的所有操作要么全部執(zhí)行成功,要么全部不執(zhí)行,不存在部分執(zhí)行的情況。
- 一致性(Consistency):事務(wù)執(zhí)行前后,數(shù)據(jù)庫(kù)的完整性約束沒(méi)有被破壞,數(shù)據(jù)庫(kù)從一個(gè)一致性狀態(tài)轉(zhuǎn)換到另一個(gè)一致性狀態(tài)。
- 隔離性(Isolation):多個(gè)事務(wù)并發(fā)執(zhí)行時(shí),每個(gè)事務(wù)的操作對(duì)其他事務(wù)是隔離的,一個(gè)事務(wù)的中間結(jié)果不會(huì)被其他事務(wù)看到。
- 持久性(Durability):一旦事務(wù)提交,其所做的修改將會(huì)永久保存在數(shù)據(jù)庫(kù)中,即使系統(tǒng)發(fā)生故障也不會(huì)丟失。
在數(shù)據(jù)庫(kù)中,事務(wù)可以使用以下語(yǔ)法來(lái)控制:
BEGIN TRANSACTION; -- 開始事務(wù)
-- 執(zhí)行一系列數(shù)據(jù)庫(kù)操作
COMMIT; -- 提交事務(wù)
ROLLBACK; -- 回滾事務(wù)
在SQLite中,事務(wù)是一組數(shù)據(jù)庫(kù)操作,這些操作要么全部成功執(zhí)行,要么全部失敗回滾。SQLite使用以下語(yǔ)句來(lái)控制事務(wù):
- BEGIN TRANSACTION: 開始一個(gè)新的事務(wù)
- COMMIT: 提交事務(wù),將所有操作永久保存到數(shù)據(jù)庫(kù)
- ROLLBACK: 回滾事務(wù),撤銷自上次BEGIN TRANSACTION以來(lái)的所有操作
在SQLite中,默認(rèn)情況下,每個(gè)SQL語(yǔ)句都被視為一個(gè)事務(wù)。如果要在一個(gè)事務(wù)中執(zhí)行多個(gè)操作,可以使用BEGIN TRANSACTION開始事務(wù),然后使用COMMIT提交事務(wù),或者使用ROLLBACK回滾事務(wù)。
例如,要在SQLite中執(zhí)行一個(gè)事務(wù),可以按照以下格式編寫SQL語(yǔ)句:
BEGIN TRANSACTION;
-- 執(zhí)行一系列數(shù)據(jù)庫(kù)操作
COMMIT;
在Android開發(fā)中,SQLite對(duì)于事物的操作如下:
// 開始事務(wù)
db.beginTransaction();
try {
// 執(zhí)行數(shù)據(jù)庫(kù)操作
// 插入數(shù)據(jù)
db.insert(TABLE_NAME, null, values);
// 更新數(shù)據(jù)
db.update(TABLE_NAME, values, whereClause, whereArgs);
// 刪除數(shù)據(jù)
db.delete(TABLE_NAME, whereClause, whereArgs);
// 標(biāo)記事務(wù)成功
db.setTransactionSuccessful();
} finally {
// 結(jié)束事務(wù)
db.endTransaction();
}
這樣,如果在BEGIN TRANSACTION和COMMIT之間的操作中發(fā)生錯(cuò)誤,整個(gè)事務(wù)將被回滾,數(shù)據(jù)庫(kù)將不會(huì)受到影響。