存储方案 | 特点 | 适用场景 |
---|---|---|
SQLite | 轻量级关系型数据库,安卓原生支持 | 结构化数据存储,复杂查询需求 |
Room | 基于SQLite的抽象层,提供编译时验证 | 需要类型安全、规范开发的项目 |
Realm | 面向对象的数据库,高性能读写 | 实时数据处理、复杂对象存储 |
SharedPreferences | 键值对存储,简单快速 | 少量配置信息存储 |
文件存储 | 以文件形式保存数据(如JSON、XML) | 非结构化数据或临时数据 |
特点:
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"});
特点:
核心组件:
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 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需手动加锁 |
性能优化 | 使用索引、事务批量操作、预编译语句 |
MODE_PRIVATE
androidx.room:room-testing
进行单元测试RecyclerView
模拟大量数据操作测试性能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();
A:
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();