上一篇
安卓开发怎么弄数据库
- 行业动态
- 2025-04-22
- 3
安卓开发可通过Room组件(推荐)或SQLite实现本地数据库,使用@Entity/@Dao注解定义表结构,配合ViewModel+LiveData管理数据,远程数据库可选Firebase或自建REST
安卓数据库开发基础
SQLite(原生关系型数据库)
SQLite是安卓系统内置的轻量级数据库,适合存储结构化数据。
核心组件:
SQLiteOpenHelper
:管理数据库创建与升级SQLiteDatabase
:执行SQL操作ContentValues
:存储键值对数据
使用步骤:
创建数据库帮助类
class MyDatabaseHelper(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) { override fun onCreate(db: SQLiteDatabase) { // 创建表结构 db.execSQL("CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)") } override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { // 数据库升级处理 db.execSQL("ALTER TABLE user ADD COLUMN address TEXT") } }
增删改查操作
// 插入数据 val db = helper.writableDatabase val values = ContentValues().apply { put("name", "张三") put("age", 25) } db.insert("user", null, values)
// 查询数据
val cursor = db.query(“user”, arrayOf(“id”, “name”, “age”), null, null, null, null, null)
while (cursor.moveToNext()) {
val id = cursor.getInt(0)
val name = cursor.getString(1)
val age = cursor.getInt(2)
}
| 操作类型 | 适用场景 | 性能特点 |
|---------|---------|---------|
| 插入(INSERT) | 批量添加数据 | 单条性能较低 |
| 更新(UPDATE) | 修改已有记录 | 需索引优化 |
| 删除(DELETE) | 移除指定记录 | 依赖WHERE条件 |
| 查询(SELECT) | 读取数据 | 可结合索引优化 |
# 2. Room(谷歌推荐持久化库)
Room是基于SQLite的抽象层,提供编译时校验和流畅API。
核心组件:
`@Entity`:定义数据表结构
`@Dao`:数据访问对象接口
`@Database`:数据库配置类
实现示例:
```kotlin
// 1. 定义实体
@Entity(tableName = "user")
data class User(
@PrimaryKey(autoGenerate = true) val id: Int,
val name: String,
val age: Int
)
// 2. 创建DAO接口
@Dao
interface UserDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertUser(user: User)
@Query("SELECT FROM user WHERE id = :userId")
fun getUserById(userId: Int): LiveData<User>
}
// 3. 配置数据库
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
优势对比:
| 特性 | SQLite | Room |
|—————|———————-|———————–|
| 编译时校验 | 无 | ️ |
| 线程安全 | 需手动处理 | 自动支持LiveData |
| 类型安全 | 字符串拼接易错 | 编译期检查 |
| 复杂查询支持 | 需手写SQL | 支持复杂注解查询 |
Realm(高性能移动数据库)
Realm适用于需要高频读写的实时应用场景。
核心特点:
- 零拷贝数据访问
- 跨线程数据共享
- 自动双向同步
基本用法:
// 初始化Realm Realm.init(context) val realm = Realm.getDefaultInstance() // 插入数据 realm.executeTransaction { val user = it.createObject(User::class.java, "张三").setAge(25) } // 查询数据(实时更新) val results = realm.where(User::class.java).equalTo("name", "张三").findAll()
数据库操作最佳实践
数据库版本管理
- 使用
SQLiteOpenHelper
的onUpgrade()
处理结构变更 - Room通过
migrationStrategy
实现版本迁移 - 重大变更建议版本号+1并重建数据库
- 使用
线程管理
- 数据库操作应在子线程执行(Room支持协程)
- 使用
LiveData
自动观察数据变化 - Realm支持多线程共享数据副本
数据加密
- SQLCipher扩展库支持SQLite加密
- Room可通过
SupportFactory
集成加密实现 - Realm内置AES-256加密支持
常见问题与解答
Q1:如何选择合适的移动数据库?
- SQLite:简单需求、熟悉SQL语法的场景
- Room:需要编译时校验、响应式编程的项目
- Realm:高频实时读写、跨线程共享需求
- Firebase:需要云端同步、实时监听的应用
Q2:数据库版本升级时如何处理数据迁移?
- SQLite方案:在
onUpgrade()
中编写ALTER语句或数据迁移脚本 - Room方案:通过
fallbackToDestructiveMigration()
或自定义Migration
类逐步迁移 - Realm方案:使用
RealmConfiguration.SchemaVersion
配合迁移闭包