当前位置:首页 > 行业动态 > 正文

安卓开发怎么弄数据库

安卓开发可通过Room组件(推荐)或SQLite实现本地数据库,使用@Entity/@Dao注解定义表结构,配合ViewModel+LiveData管理数据,远程数据库可选Firebase或自建REST

安卓数据库开发基础

SQLite(原生关系型数据库)

SQLite是安卓系统内置的轻量级数据库,适合存储结构化数据。

核心组件:

  • SQLiteOpenHelper:管理数据库创建与升级
  • SQLiteDatabase:执行SQL操作
  • ContentValues:存储键值对数据

使用步骤:

  1. 创建数据库帮助类

    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")
     }
    }
  2. 增删改查操作

    // 插入数据
    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()

数据库操作最佳实践

  1. 数据库版本管理

    • 使用SQLiteOpenHelperonUpgrade()处理结构变更
    • Room通过migrationStrategy实现版本迁移
    • 重大变更建议版本号+1并重建数据库
  2. 线程管理

    • 数据库操作应在子线程执行(Room支持协程)
    • 使用LiveData自动观察数据变化
    • Realm支持多线程共享数据副本
  3. 数据加密

    • SQLCipher扩展库支持SQLite加密
    • Room可通过SupportFactory集成加密实现
    • Realm内置AES-256加密支持

常见问题与解答

Q1:如何选择合适的移动数据库?

  • SQLite:简单需求、熟悉SQL语法的场景
  • Room:需要编译时校验、响应式编程的项目
  • Realm:高频实时读写、跨线程共享需求
  • Firebase:需要云端同步、实时监听的应用

Q2:数据库版本升级时如何处理数据迁移?

  • SQLite方案:在onUpgrade()中编写ALTER语句或数据迁移脚本
  • Room方案:通过fallbackToDestructiveMigration()或自定义Migration类逐步迁移
  • Realm方案:使用RealmConfiguration.SchemaVersion配合迁移闭包
0