讲解 Android 常用开源数据库实现原理

215 阅读5分钟

一、SQLite:Android 的 “内置文件柜”

SQLite 是 Android 系统内置的轻量级关系型数据库,本质是一个存放在磁盘上的单一文件,就像一个 “带索引的文件柜”。

1. 核心存储结构:B + 树索引与页存储
  • 数据存储
    数据按 “页(Page)” 存储(默认 4KB / 页),每页类似一个抽屉,存放表的行数据。例如:用户表的每一行数据会被拆分成多个页存储。
  • 索引机制
    使用 B + 树索引(类似字典的目录),例如给 “用户表” 的 “用户名” 字段建索引,就像在字典中按拼音首字母快速查字,大幅提升查询速度。
  • 案例类比
    数据库文件如同一个文件柜,每个表是抽屉,页是抽屉里的文件夹,B + 树索引是文件夹的标签,让你快速找到目标文件。
2. 事务处理:原子性的 “转账保险箱”
  • ACID 特性
    事务确保操作要么全成功,要么全失败。例如转账时,扣钱和加钱必须同时完成,否则回滚。
  • 实现原理
    通过日志文件(WAL 模式)记录操作,若中途崩溃,重启时根据日志恢复数据,类似转账时先写纸条记录步骤,完成后再擦掉。
3. Android 中的封装:ContentProvider 与 SQLiteOpenHelper
  • ContentProvider
    系统级数据共享接口,类似 “文件柜管理员”,控制其他应用对数据库的访问权限。
  • SQLiteOpenHelper
    简化数据库创建和版本管理,例如创建表时自动执行 SQL 语句,版本更新时迁移数据。

二、Room:SQLite 的 “智能翻译官”

Room 是 Google 基于 SQLite 的 ORM(对象关系映射)框架,像一个 “会自动生成 SQL 的翻译官”,让开发者用 Java/Kotlin 对象操作数据库。

1. 核心原理:编译时代码生成
  • 注解处理
    通过注解(如@Entity)标记数据类,编译时自动生成 SQL 语句。例如:

    java

    @Entity(tableName = "users")
    class User {
        @PrimaryKey long id;
        String name;
    }
    

    编译后会生成INSERT INTO users (name) VALUES (?)等 SQL 语句。

  • 类型安全
    自动将 Java 类型映射到 SQL 类型(如intINTEGER),避免 SQL 注入风险。

2. 缓存与查询优化:LiveData 与 RxJava 集成
  • 数据观察
    结合 LiveData 实现数据变更自动通知 UI,类似 “订阅报纸”,数据更新时自动推送。
  • 异步查询
    强制查询在子线程执行,避免主线程阻塞,类似 “让助理去文件柜找资料,自己不等待”。
3. 架构优势:分层设计
  • 三层架构

    • Entity:数据实体类(如 User)
    • DAO:数据访问对象(定义查询方法)
    • Database:数据库配置(版本管理)
      解耦业务逻辑与数据操作,类似 “图书馆的分类索引系统”。

三、Realm:跨平台的 “内存映射大师”

Realm 是一个跨平台的非关系型数据库,采用内存映射文件技术,像 “直接操作内存的高速通道”。

1. 内存映射:直接操作磁盘的 “魔法”
  • 原理
    将数据库文件直接映射到内存地址,读写操作直接修改内存,系统自动同步到磁盘。类似 “直接在文件柜上修改文件,无需复制到桌面”。
  • 优势
    读写速度比 SQLite 快 3-5 倍,尤其适合频繁读写场景(如聊天记录)。
2. 数据模型:对象即数据
  • 无 ORM 层
    直接操作 RealmObject 对象,无需转换。例如:

    java

    Realm realm = Realm.getDefaultInstance();
    realm.beginTransaction();
    User user = realm.createObject(User.class);
    user.setName("张三");
    realm.commitTransaction();
    

    数据对象直接对应数据库记录,类似 “直接操作文件内容,无需翻译”。

3. 跨平台与线程安全
  • 多平台共享
    一套数据模型可用于 Android、iOS、Web,类似 “多语言通用的文件格式”。
  • 线程安全
    通过 Realm 实例隔离不同线程数据,避免并发冲突,类似 “每个线程有独立的文件柜副本”。

四、GreenDAO:轻量级的 “SQL 优化器”

GreenDAO 是另一个 ORM 框架,主打高性能和轻量级,像 “手工优化的 SQL 执行引擎”。

1. 极致性能:手动优化 SQL 执行
  • 代码生成
    生成的 SQL 语句经过手工优化,例如批量插入时合并为一条 SQL,减少数据库交互次数。
  • 对象池
    复用对象实例,减少 GC 开销,类似 “重复使用文件袋,避免频繁创建新文件”。
2. 最小依赖:仅 100KB 的 “轻量级选手”
  • 依赖精简
    不依赖其他框架(如 Room 依赖 AndroidX),适合旧项目集成。

五、各数据库适用场景对比

数据库核心优势适用场景原理特点
SQLite系统内置,轻量级简单本地存储、离线缓存B + 树索引,事务日志
Room类型安全,架构清晰复杂业务逻辑,MVVM 架构编译时生成 SQL,LiveData 集成
Realm高性能,跨平台高频读写,多端数据共享内存映射文件,对象直接存储
GreenDAO极致性能,轻量级旧项目优化,内存敏感场景手工优化 SQL,对象池技术

六、总结:选择数据库的 “三板斧”

  1. 需求优先

    • 简单场景:SQLite 直接操作或 Room(易上手)。
    • 高性能读写:Realm(内存映射)或 GreenDAO(SQL 优化)。
  2. 架构匹配

    • MVVM 项目:Room+LiveData(数据观察方便)。
    • 跨平台项目:Realm(一套代码多端运行)。
  3. 性能权衡

    • 首次加载速度:SQLite/Room(磁盘操作)< Realm(内存映射)。

    • 内存占用:Realm(直接操作内存)> SQLite(页存储)。

理解这些数据库的原理,就像掌握不同工具的特性,根据场景选择合适的 “数据存储武器”,才能打造高效稳定的 Android 应用。