上一篇
安卓备带数据库的项目
- 行业动态
- 2025-04-22
- 5
数据库选型与对比
常见数据库类型
数据库类型 | 特点 | 适用场景 |
---|---|---|
SQLite | 轻量级嵌入式数据库,Android 内置支持 | 简单数据存储(如配置、日志) |
Room | SQLite 的抽象层,提供编译时校验 | 需要类型安全和复杂操作的场景 |
Realm | 面向对象的数据库,支持多平台 | 高性能复杂对象存储(如实时同步) |
Firebase Firestore | 云数据库,实时同步 | 需要跨设备同步的在线应用 |
推荐方案
- 中小型项目:优先选择 Room(基于 SQLite),兼顾性能与开发效率。
- 复杂对象存储:考虑 Realm(如树形结构数据)。
- 在线同步需求:使用 Firebase Firestore 或自建远程数据库。
Room 数据库实现步骤
添加依赖
// build.gradle (Module) implementation "androidx.room:room-runtime:2.5.1" annotationProcessor "androidx.room:room-compiler:2.5.1"
定义实体类
// @Entity 标注表名,指定主键 @Entity(tableName = "note_table") public class Note { @PrimaryKey(autoGenerate = true) // 自增主键 public int id; @ColumnInfo(name = "content") // 自定义列名 public String content; @ColumnInfo(name = "timestamp") public long timestamp; }
创建 DAO 接口
// Data Access Object,定义数据库操作 @Dao public interface NoteDao { @Insert void insert(Note note); // 插入数据 @Update void update(Note note); // 更新数据 @Delete void delete(Note note); // 删除数据 @Query("SELECT FROM note_table ORDER BY timestamp DESC") List<Note> getAllNotes(); // 自定义查询 }
配置数据库
// 抽象数据库类,包含多个 DAO @Database(entities = {Note.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract NoteDao noteDao(); // 获取 DAO 实例 }
初始化数据库
// 在 Application 类中初始化 AppDatabase db = Room.databaseBuilder( getApplicationContext(), AppDatabase.class, "app_database.db" ).build();
数据库操作优化策略
优化方向 | 具体措施 |
---|---|
性能优化 | 使用 LiveData 代替手动观察数据变化分页查询( PagingSource )处理大数据集 |
线程安全 | 通过 Executors.newSingleThreadExecutor() 执行数据库操作使用 RxJava 或 Kotlin Coroutines 处理异步任务 |
内存优化 | 避免直接返回大数据集合,改用 Cursor 或分页加载及时关闭数据库连接 |
常见问题与解决方案
数据库版本升级导致崩溃
原因:
version
码变更后未处理迁移逻辑。解决:
Room.databaseBuilder(context, AppDatabase.class, "app_database.db") .addMigrations(MIGRATION_1_2) // 添加迁移脚本 .build(); // 迁移脚本示例 static final Migration MIGRATION_1_2 = new Migration() { @Override public void migrate(SupportSQLiteDatabase database) { database.execSQL("ALTER TABLE note_table ADD COLUMN status INTEGER NOT NULL DEFAULT 0"); } };
多线程并发导致数据不一致
- 原因:多个线程同时写入数据库。
- 解决:
- 使用
synchronized
关键字锁定关键代码段。 - 通过
LiveData
或Flow
保证数据单向流动。
- 使用
相关问题与解答
问题1:Room 相比直接使用 SQLite 的优势是什么?
解答:
Room 提供了以下改进:
- 编译时校验:避免语法错误导致的运行时崩溃。
- 类型安全:自动生成
DAO
实现类,减少手写 SQL 的冗余。 - 集成 LiveData:支持观察数据变化,简化 UI 层开发。
- 迁移工具:内置版本控制和数据迁移框架。
问题2:如何在 Room 中实现复杂查询(如多表联查)?
解答:
定义关联实体:使用
@Relation
注解关联多个表。@Entity(tableName = "user_table") public class User { @PrimaryKey public int id; public String name; } @Entity(tableName = "post_table") public class Post { @PrimaryKey public int id; public int userId; public String content; } // 定义关系 public class UserWithPosts { @Embedded public User user; @Relation(parentColumn = "id", entityColumn = "userId") public List<Post> posts; }
编写带关系的查询:
@Transaction @Query("SELECT FROM user_table") public abstract List<UserWithPosts> getUsersWithPosts();
事务控制:使用
@Transaction
保证多表操作的原子性