SQLite 是一种轻量级的嵌入式数据库,在 Android 中用于存储结构化数据。你可以通过 SQLiteOpenHelper 来管理数据库的创建、升级、和版本管理。以下是使用 SQLite 的基本步骤:

1. 创建数据库和表

使用 SQLiteOpenHelper 创建数据库以及表结构。这个类会帮助你创建数据库、执行表的升级、降级等操作。

创建 SQLiteOpenHelper 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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() 方法来实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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() 方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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() 方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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() 方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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() 方法。

1
2
3
4
5
6
7
8
9
10
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. 关闭数据库连接

每次操作完数据库后,记得关闭数据库连接,防止内存泄漏:

1
db.close()

总结

  1. 创建数据库和表:通过继承 SQLiteOpenHelper 类来创建数据库及表。
  2. 插入数据:使用 ContentValues 结合 insert() 方法插入数据。
  3. 查询数据:通过 query()rawQuery() 查询数据,返回 Cursor 对象进行遍历。
  4. 更新数据:使用 update() 方法更新数据。
  5. 删除数据:使用 delete() 方法删除数据。
  6. 关闭数据库连接:操作完成后记得关闭数据库。

SQLite 提供了强大的本地数据存储能力,适合用于需要存储结构化数据的应用。

完整示例

假设我们有一个应用需要保存用户信息,每个用户包含 idnameemail。我们可以在数据库中创建一个表并对数据进行增删改查操作。

1. 数据库助手类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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. 插入数据

1
2
3
4
5
6
7
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. 查询数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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. 更新数据

1
2
3
4
5
6
7
8
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. 删除数据

1
2
3
4
5
val selection = "${MyDatabaseHelper.COLUMN_ID} = ?"
val selectionArgs = arrayOf("1")

val db = dbHelper.writableDatabase
db.delete(MyDatabaseHelper.TABLE_NAME, selection, selectionArgs)

6. 关闭数据库

1
db.close()

总结

  • SQLiteOpenHelper:管理数据库的创建、升级等操作。
  • SQLiteDatabase:用于执行数据库操作,如插入、查询、更新、删除。
  • ContentValues:用于存储要插入或更新的数据。
  • Cursor:用于访问查询结果。

SQLite 是一种非常有效的方式来在 Android 上进行本地数据存储,尤其适用于存储小型结构化数据。