SQLite 是一种轻量级的嵌入式数据库,在 Android 中用于存储结构化数据。你可以通过 SQLiteOpenHelper 来管理数据库的创建、升级、和版本管理。以下是使用 SQLite 的基本步骤:
1. 创建数据库和表
使用 SQLiteOpenHelper 创建数据库以及表结构。这个类会帮助你创建数据库、执行表的升级、降级等操作。
创建 SQLiteOpenHelper 类
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
class MyDatabaseHelper(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
companion object {
private const val DATABASE_NAME = "my_database.db" // 数据库名称
private const val DATABASE_VERSION = 1 // 数据库版本号
private const val TABLE_NAME = "users" // 表名称
}
override fun onCreate(db: SQLiteDatabase) {
// 创建数据库表
val createTableQuery = """
CREATE TABLE $TABLE_NAME (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER
)
""".trimIndent()
db.execSQL(createTableQuery)
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
// 如果数据库版本变化时,删除旧表并创建新表
db.execSQL("DROP TABLE IF EXISTS $TABLE_NAME")
onCreate(db)
}
}
onCreate:当数据库首次创建时执行。通常在这里创建表和初始化数据。onUpgrade:当数据库版本发生变化时执行。你可以在这里进行表的迁移或删除。
2. 插入数据
插入数据需要通过 SQLiteDatabase.insert() 方法来实现。
import android.content.ContentValues
fun insertUser(context: Context, name: String, age: Int) {
val dbHelper = MyDatabaseHelper(context)
val db = dbHelper.writableDatabase
val values = ContentValues().apply {
put("name", name)
put("age", age)
}
db.insert("users", null, values)
db.close()
}
ContentValues:是用于存储要插入的数据的容器。通过put方法将列名和值添加到ContentValues中。insert:插入数据的方法,第一个参数是表名,第二个参数是列为空时插入的默认值,第三个参数是ContentValues。
3. 查询数据
查询数据使用 SQLiteDatabase.query() 或 SQLiteDatabase.rawQuery() 方法。
使用 query() 方法
import android.database.Cursor
fun queryUsers(context: Context): List<User> {
val dbHelper = MyDatabaseHelper(context)
val db = dbHelper.readableDatabase
val cursor: Cursor = db.query(
"users", // 表名
arrayOf("id", "name", "age"), // 列名
null, // WHERE 子句
null, // WHERE 子句的参数
null, // GROUP BY 子句
null, // HAVING 子句
null // ORDER BY 子句
)
val users = mutableListOf<User>()
while (cursor.moveToNext()) {
val id = cursor.getLong(cursor.getColumnIndexOrThrow("id"))
val name = cursor.getString(cursor.getColumnIndexOrThrow("name"))
val age = cursor.getInt(cursor.getColumnIndexOrThrow("age"))
users.add(User(id, name, age))
}
cursor.close()
db.close()
return users
}
data class User(val id: Long, val name: String, val age: Int)
query:用于查询数据库,返回一个Cursor对象。你可以通过Cursor遍历结果集。getColumnIndexOrThrow():根据列名获取列的索引,getString(),getInt()等方法用于提取数据。
使用 rawQuery() 方法
fun queryUsersRaw(context: Context): List<User> {
val dbHelper = MyDatabaseHelper(context)
val db = dbHelper.readableDatabase
val cursor: Cursor = db.rawQuery("SELECT * FROM users", null)
val users = mutableListOf<User>()
while (cursor.moveToNext()) {
val id = cursor.getLong(cursor.getColumnIndex("id"))
val name = cursor.getString(cursor.getColumnIndex("name"))
val age = cursor.getInt(cursor.getColumnIndex("age"))
users.add(User(id, name, age))
}
cursor.close()
db.close()
return users
}
rawQuery():执行原始的 SQL 查询语句,返回一个Cursor。
4. 更新数据
更新数据使用 SQLiteDatabase.update() 方法。
import android.content.ContentValues
fun updateUser(context: Context, id: Long, name: String, age: Int) {
val dbHelper = MyDatabaseHelper(context)
val db = dbHelper.writableDatabase
val values = ContentValues().apply {
put("name", name)
put("age", age)
}
val selection = "id = ?"
val selectionArgs = arrayOf(id.toString())
db.update("users", values, selection, selectionArgs)
db.close()
}
update():更新数据的方法。第一个参数是表名,第二个参数是更新的值,第三个参数是WHERE子句,第四个参数是WHERE子句的参数。
5. 删除数据
删除数据使用 SQLiteDatabase.delete() 方法。
fun deleteUser(context: Context, id: Long) {
val dbHelper = MyDatabaseHelper(context)
val db = dbHelper.writableDatabase
val selection = "id = ?"
val selectionArgs = arrayOf(id.toString())
db.delete("users", selection, selectionArgs)
db.close()
}
delete():删除数据的方法,类似于update()方法,传入WHERE子句来指定删除条件。
6. 关闭数据库连接
每次操作完数据库后,记得关闭数据库连接,防止内存泄漏:
db.close()
总结
- 创建数据库和表:通过继承
SQLiteOpenHelper类来创建数据库及表。 - 插入数据:使用
ContentValues结合insert()方法插入数据。 - 查询数据:通过
query()或rawQuery()查询数据,返回Cursor对象进行遍历。 - 更新数据:使用
update()方法更新数据。 - 删除数据:使用
delete()方法删除数据。 - 关闭数据库连接:操作完成后记得关闭数据库。
SQLite 提供了强大的本地数据存储能力,适合用于需要存储结构化数据的应用。
完整示例
假设我们有一个应用需要保存用户信息,每个用户包含 id、name 和 email。我们可以在数据库中创建一个表并对数据进行增删改查操作。
1. 数据库助手类
class MyDatabaseHelper(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
companion object {
const val DATABASE_NAME = "my_database.db"
const val DATABASE_VERSION = 1
const val TABLE_NAME = "users"
const val COLUMN_ID = "id"
const val COLUMN_NAME = "name"
const val COLUMN_EMAIL = "email"
}
override fun onCreate(db: SQLiteDatabase?) {
val createTableQuery = """
CREATE TABLE $TABLE_NAME (
$COLUMN_ID INTEGER PRIMARY KEY AUTOINCREMENT,
$COLUMN_NAME TEXT,
$COLUMN_EMAIL TEXT
)
"""
db?.execSQL(createTableQuery)
}
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
db?.execSQL("DROP TABLE IF EXISTS $TABLE_NAME")
onCreate(db)
}
}
2. 插入数据
val dbHelper = MyDatabaseHelper(context)
val db = dbHelper.writableDatabase
val values = ContentValues().apply {
put(MyDatabaseHelper.COLUMN_NAME, "John Doe")
put(MyDatabaseHelper.COLUMN_EMAIL, "john.doe@example.com")
}
db.insert(MyDatabaseHelper.TABLE_NAME, null, values)
3. 查询数据
val db = dbHelper.readableDatabase
val cursor = db.query(
MyDatabaseHelper.TABLE_NAME,
arrayOf(MyDatabaseHelper.COLUMN_ID, MyDatabaseHelper.COLUMN_NAME, MyDatabaseHelper.COLUMN_EMAIL),
null, null, null, null, null
)
while (cursor.moveToNext()) {
val id = cursor.getLong(cursor.getColumnIndex(MyDatabaseHelper.COLUMN_ID))
val name = cursor.getString(cursor.getColumnIndex(MyDatabaseHelper.COLUMN_NAME))
val email = cursor.getString(cursor.getColumnIndex(MyDatabaseHelper.COLUMN_EMAIL))
println("User: $id, $name, $email")
}
cursor.close()
4. 更新数据
val values = ContentValues().apply {
put(MyDatabaseHelper.COLUMN_NAME, "John Smith")
}
val selection = "${MyDatabaseHelper.COLUMN_ID} = ?"
val selectionArgs = arrayOf("1")
val db = dbHelper.writableDatabase
db.update(MyDatabaseHelper.TABLE_NAME, values, selection, selectionArgs)
5. 删除数据
val selection = "${MyDatabaseHelper.COLUMN_ID} = ?"
val selectionArgs = arrayOf("1")
val db = dbHelper.writableDatabase
db.delete(MyDatabaseHelper.TABLE_NAME, selection, selectionArgs)
6. 关闭数据库
db.close()
总结
- SQLiteOpenHelper:管理数据库的创建、升级等操作。
- SQLiteDatabase:用于执行数据库操作,如插入、查询、更新、删除。
- ContentValues:用于存储要插入或更新的数据。
- Cursor:用于访问查询结果。
SQLite 是一种非常有效的方式来在 Android 上进行本地数据存储,尤其适用于存储小型结构化数据。