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

安卓开发数据库存放本地

安卓本地数据库存储方案

存储方案 特点 适用场景
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需手动加锁
性能优化 使用索引、事务批量操作、预编译语句

最佳实践建议

  1. 优先选择Room:除非有特殊性能需求(如Realm的极致读写速度),否则推荐使用Room,平衡开发效率和性能。
  2. 数据模型设计
    • 遵循范式原则,避免冗余存储
    • 合理使用外键关联(Room支持@Relation)
  3. 隐私保护
    • 敏感数据必须加密存储(如SharedPreferences使用EncryptedSharedPreferences)
    • 数据库文件权限设置为MODE_PRIVATE
  4. 测试策略
    • 使用androidx.room:room-testing进行单元测试
    • 通过RecyclerView模拟大量数据操作测试性能

相关问题与解答

Q1:Room如何实现数据库加密?

A

  1. 添加依赖:implementation "androidx.room:room-runtime:2.5.1" + implementation "androidx.room:room-ktx:2.5.1"(Kotlin)
  2. 创建支持加密的工厂类:
    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");
     }
    }
  3. Room.databaseBuilder()中设置工厂:
    AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app.db")
     .openHelperFactory(new EncryptedSupportFactory())
     .build();

Q2:如何在Realm中实现复杂查询?

A

  1. 使用链式API:
    realm.where(User.class)
     .equalTo("age", 18)
     .beginGroup()
     .equalTo("status", "active")
     .endGroup()
     .findAll();
  2. 动态条件构建:
    RealmQuery<User> query = realm.where(User.class);
    if (filterAge) query.equalTo("age", 20);
    if (filterStatus) query.equalTo("status", "online");
    query.findAll();