上一篇
安卓开发数据库存放本地
- 行业动态
- 2025-04-21
- 5
安卓本地数据库存储方案
存储方案 | 特点 | 适用场景 |
---|---|---|
SQLite | 轻量级关系型数据库,安卓原生支持 | 结构化数据存储,复杂查询需求 |
Room | 基于SQLite的抽象层,提供编译时验证 | 需要类型安全、规范开发的项目 |
Realm | 面向对象的数据库,高性能读写 | 实时数据处理、复杂对象存储 |
SharedPreferences | 键值对存储,简单快速 | 少量配置信息存储 |
文件存储 | 以文件形式保存数据(如JSON、XML) | 非结构化数据或临时数据 |
主流方案实现与对比
SQLite 直接使用
特点:
- 原生支持,无需额外依赖
- 需手动管理数据库创建、升级、操作
- 直接使用
SQLiteDatabase
API
示例代码:
// 获取可写数据库 SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase("app.db", null); // 创建表 db.execSQL("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)"); // 插入数据 db.execSQL("INSERT INTO users (name) VALUES (?)", new Object[]{"Alice"});
Room 持久化库
特点:
- 编译时验证SQL正确性
- 自动生成DAO实现类
- 支持LiveData和RxJava
- 简化数据库迁移
核心组件:
Entity
:定义数据表结构DAO
:定义数据库操作接口Database
:继承RoomDatabase
,包含多个DAO
示例代码:
// Entity定义 @Entity public class User { @PrimaryKey(autoGenerate = true) public int id; public String name; } // DAO接口 @Dao public interface UserDao { @Insert void insert(User user); @Query("SELECT FROM User") LiveData<List<User>> getAllUsers(); } // 数据库类 @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
Realm 数据库
特点:
- 面向对象API,无需定义Schema
- 高性能读写(接近NoSQL)
- 自动更新UI(类似LiveData)
- 跨平台支持(iOS/Android)
示例代码:
Realm realm = Realm.getDefaultInstance(); realm.executeTransaction(r -> { User user = r.createObject(User.class); user.name = "Bob"; });
关键问题处理方案
问题 | 解决方案 |
---|---|
数据库升级 | SQLite:ALTER TABLE 或手动迁移Room: Migration 类定义迁移逻辑 |
数据加密 | SQLite:自定义sqlite_master 表加密Room:使用 SupportFactory 添加加密支持 |
大文件存储 | 建议使用文件系统,通过BLOB字段存储文件路径 |
多线程安全 | Room/Realm天然支持多线程 SQLite需手动加锁 |
性能优化 | 使用索引、事务批量操作、预编译语句 |
最佳实践建议
- 优先选择Room:除非有特殊性能需求(如Realm的极致读写速度),否则推荐使用Room,平衡开发效率和性能。
- 数据模型设计:
- 遵循范式原则,避免冗余存储
- 合理使用外键关联(Room支持@Relation)
- 隐私保护:
- 敏感数据必须加密存储(如SharedPreferences使用EncryptedSharedPreferences)
- 数据库文件权限设置为
MODE_PRIVATE
- 测试策略:
- 使用
androidx.room:room-testing
进行单元测试 - 通过
RecyclerView
模拟大量数据操作测试性能
- 使用
相关问题与解答
Q1:Room如何实现数据库加密?
A:
- 添加依赖:
implementation "androidx.room:room-runtime:2.5.1"
+implementation "androidx.room:room-ktx:2.5.1"
(Kotlin) - 创建支持加密的工厂类:
public class EncryptedSupportFactory implements SupportDatabaseInspector.SupportFactory { @Override public SupportDatabaseInspector create(Context context, String name, int version) { return new EncryptedSupportDatabase(context, name, version, "your-encryption-key"); } }
- 在
Room.databaseBuilder()
中设置工厂:AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app.db") .openHelperFactory(new EncryptedSupportFactory()) .build();
Q2:如何在Realm中实现复杂查询?
A:
- 使用链式API:
realm.where(User.class) .equalTo("age", 18) .beginGroup() .equalTo("status", "active") .endGroup() .findAll();
- 动态条件构建:
RealmQuery<User> query = realm.where(User.class); if (filterAge) query.equalTo("age", 20); if (filterStatus) query.equalTo("status", "online"); query.findAll();