SQLite 是一种轻量级、嵌入式关系型数据库,广泛用于移动应用和小型项目中,适合存储结构化数据。以下是对 SQLite 数据库的简介,涵盖核心概念、在 Android 中的使用方法及注意事项,保持简洁并附带代码示例。
1. 基本概念
- 定义:SQLite 是一个无服务器、零配置、嵌入式的关系型数据库,数据存储在单一文件中。
- 特点:
- 轻量:占用空间小,适合资源受限环境。
- 支持 SQL:标准 SQL 语法,易于查询和操作。
- 跨平台:支持 Android、iOS、桌面应用等。
- 单文件存储:数据存于
.db文件,易于管理。 - 适用场景:本地数据存储,如用户数据、缓存、配置等。
- 局限性:不支持高并发,适合单用户或低并发场景。
2. 在 Android 中使用 SQLite
以下以 Android(Java/Kotlin)为例,展示 SQLite 的基本操作。
创建数据库
Android 使用 SQLiteOpenHelper 管理数据库创建和升级。
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
class DatabaseHelper(context: Context) : SQLiteOpenHelper(context, “MyDatabase.db”, null, 1) {
override fun onCreate(db: SQLiteDatabase) {
// 创建表
val createTable = “””
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
age INTEGER
)
“””
db.execSQL(createTable)
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
// 升级数据库
db.execSQL("DROP TABLE IF EXISTS users")
onCreate(db)
}
}
插入数据
val dbHelper = DatabaseHelper(context)
val db = dbHelper.writableDatabase
val values = ContentValues().apply {
put("username", "Alice")
put("age", 25)
}
db.insert("users", null, values)
db.close()
查询数据
val db = dbHelper.readableDatabase
val cursor = db.query("users", arrayOf("id", "username", "age"),
"username = ?", arrayOf("Alice"), null, null, null)
while (cursor.moveToNext()) {
val id = cursor.getInt(0)
val username = cursor.getString(1)
val age = cursor.getInt(2)
Log.d("SQLite", "ID: $id, Username: $username, Age: $age")
}
cursor.close()
db.close()
更新数据
val db = dbHelper.writableDatabase
val values = ContentValues().apply {
put("age", 26)
}
db.update("users", values, "username = ?", arrayOf("Alice"))
db.close()
删除数据
val db = dbHelper.writableDatabase
db.delete("users", "username = ?", arrayOf("Alice"))
db.close()
3. 注意事项
- 关闭资源:操作完成后关闭
SQLiteDatabase和Cursor,避免内存泄漏。 - 异常处理:
try {
val db = dbHelper.writableDatabase
db.insert("users", null, values)
} catch (e: SQLiteException) {
Log.e("SQLite", "Database error: ${e.message}")
} finally {
db.close()
}
- 性能优化:
- 使用事务(
beginTransaction/endTransaction)批量操作。 - 索引关键字段以加速查询。
- 避免频繁打开/关闭数据库。
- 线程安全:SQLite 默认非线程安全,建议在单线程或加锁访问。
- 数据安全:敏感数据需加密,SQLite 本身存储明文。
- 数据库升级:在
onUpgrade中处理表结构变更,注意数据迁移。
4. 高级用法
- 复杂查询:支持 JOIN、子查询、聚合函数等标准 SQL 操作。
- 数据库备份:复制
.db文件实现备份。 - ORM 替代:Room 数据库(基于 SQLite)提供更现代的 API,支持 LiveData 和协程。
5. 实际应用
- 本地缓存:如离线数据、新闻列表。
- 用户数据:存储用户资料、偏好。
- 复杂结构:如多表关联的订单系统。
6. 替代方案
- Room:Android 推荐的 SQLite 封装,类型安全,支持异步。
- SharedPreferences:适合少量键值对。
- 文件存储:适合非结构化数据。
如果需要更详细的代码示例、Room 迁移方案或特定场景的 SQLite 实现,请告诉我!