rokevin
移动
前端
语言
  • 基础

    • Linux
    • 实施
    • 版本构建
  • 应用

    • WEB服务器
    • 数据库
  • 资讯

    • 工具
    • 部署
开放平台
产品设计
  • 人工智能
  • 云计算
计算机
其它
GitHub
移动
前端
语言
  • 基础

    • Linux
    • 实施
    • 版本构建
  • 应用

    • WEB服务器
    • 数据库
  • 资讯

    • 工具
    • 部署
开放平台
产品设计
  • 人工智能
  • 云计算
计算机
其它
GitHub
  • Room

[[tco]]

Room

问题

如何在 Android 中使用 Room 执行加密数据库操作?

在 Android 中,使用 Room 执行加密数据库操作需要结合 SQLCipher 库来实现。SQLCipher 是一个独立的开源库,它能加密 SQLite 数据库,并和 Room 完美结合。下面就是具体的实现步骤:

1)添加依赖: 首先,你需要在你的 build.gradle 文件中添加 SQLCipher 和 Room 库的依赖。

{
    implementation "androidx.room:room-runtime:X.Y.Z"
    annotationProcessor "androidx.room:room-compiler:X.Y.Z"
    implementation 'net.zetetic:android-database-sqlcipher:4.4.3'
    implementation "androidx.sqlite:sqlite:X.Y.Z"
}

(注:将 X.Y.Z 替换为最新版本的 Room 和 SQLite 依赖)

2)创建并配置数据库: 接下来,需要配置 Room 数据库以使用 SQLCipher。

import androidx.room.Room;
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SupportFactory;

public class MyDatabase {
    private static final String DATABASE_NAME = "encrypted_db";
    private static final char[] PASSPHRASE = "your_secure_passphrase".toCharArray();

    private static AppDatabase instance;

    public static AppDatabase getInstance(Context context) {
        if (instance == null) {
            synchronized (MyDatabase.class) {
                if (instance == null) {
                    final SupportFactory factory = new SupportFactory(SQLiteDatabase.getBytes(PASSPHRASE));
                    instance = Room.databaseBuilder(context.getApplicationContext(), 
                                                    AppDatabase.class, DATABASE_NAME)
                                    .openHelperFactory(factory)
                                    .build();
                }
            }
        }
        return instance;
    }
}

在这里,我们使用 SupportFactory 将传入的密钥转换为字节形式,然后用 Room.databaseBuilder 来创建数据库实例。

3)创建实体和 DAO 类: 创建你的实体类(表)和数据访问对象(DAO)。这些步骤和未加密的 Room 数据库相同。

import androidx.room.Entity;
import androidx.room.PrimaryKey;

@Entity(tableName = "user")
public class User {
    @PrimaryKey(autoGenerate = true)
    public int uid;

    public String firstName;
    public String lastName;
}

import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.Query;

import java.util.List;

@Dao
public interface UserDao {
    @Insert
    void insert(User user);

    @Query("SELECT * FROM user")
    List<User> getAllUsers();
}

4)创建 Database 类:

import androidx.room.Database;
import androidx.room.RoomDatabase;

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

到这里,你就完成了一个使用 Room 和 SQLCipher 加密的数据库的基本设置。

扩展知识

1)SQLCipher 的安全性: SQLCipher 使用 256-bit AES 进行加密,并且通过 OpenSSL 提供其加密功能。相比其他加密方式,它具备较高的安全性,非常适合存储需要高密度保护的数据。

2)自定义密钥管理: 在实际项目中,为了增加安全性,你可以将密钥存储在安全硬件中,比如 Android 提供的 KeyStore。这样,即使数据库文件被复制到其他设备上,也无法轻松解密。

3)性能影响: 需要注意,加密的数据库操作相比普通操作会有一定的性能开销。在进行大量数据操作或高频率操作时,这一开销可能会显现。因此,需要根据实际需求慎重考虑和测试性能。

4)其他加密库: 除了 SQLCipher,市面上还有其他加密库如 Realm,虽然它自带加密功能,但其 API 和使用方式与 Room+SQLite 有较大差异。因此,选择适合项目需求的库尤为重要。

Realm

核心维护:2020 年后停止主动功能迭代,仅偶发修复严重编译 / 系统兼容问题(如 Android 13+ 适配);2022 年后连兼容修复都极少

GitHub 仓库:主仓库(realm/realm-java)最后一次核心更新是 2021 年,2023-2025 年仅 1-2 次小修复,ISSUE/PR 大量积压无人处理

官方态度:Realm 官网已弱化 Android 版推广,转而推荐「Realm Database for Node.js/React Native」,Android 端无官方 roadmap

兼容性风险:无法适配 Kotlin 1.9+、Gradle 8.x+、Android 14/15 部分新特性,部分场景编译失败

停更核心原因

  1. 技术迭代被替代:Google 推出的 Room(Jetpack 核心组件)完美适配 Android 生态(协程、Flow、LiveData、MVVM),且基于 SQLite 稳定性更高,逐步成为 Android 本地数据库主流;
  2. 商业战略调整:Realm 被 MongoDB 收购后,资源向云原生、跨平台(React Native/Flutter)倾斜,放弃对 Android 原生版的深度维护;
  3. 架构局限性:Realm 基于自定义对象存储(非 SQL),与 Android 官方生态(如 Jetpack)兼容性差,维护成本高;
  4. 社区流失:核心开发者离职,第三方扩展(如 Realm + RxJava/Flow 适配)停止更新。

资料

Room数据库版本升级,数据迁移详解

最近更新:: 2025/12/21 00:32
Contributors: 罗凯文, luokaiwen