上一篇
安卓开发用的数据库
- 行业动态
- 2025-04-21
- 1
Android内置数据库:SQLite
SQLite是Android系统自带的关系型数据库,无需额外集成,直接通过SQLiteOpenHelper
使用。
特点:
- 轻量级:占用资源少,适合本地存储。
- ACID特性:支持原子性、一致性、隔离性、持久化。
- SQL语法:需手动编写SQL语句操作数据。
适用场景:
- 简单数据存储(如用户配置、缓存)。
- 需要事务支持的场景。
示例代码:
SQLiteOpenHelper dbHelper = new SQLiteOpenHelper(context, "dbName", null, version) { @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库升级逻辑 } }; SQLiteDatabase db = dbHelper.getWritableDatabase();
Google官方推荐:Room持久化库
Room是基于SQLite的抽象层,提供编译时校验和流畅API,减少SQL错误。
特点:
- 对象映射:通过
@Entity
将Java类映射为数据库表。 - 编译时检查:SQL语句错误在编译阶段暴露。
- LiveData支持:可与LiveData结合实现数据观察。
适用场景:
- 复杂数据操作需要类型安全。
- 需要与MVVM架构结合的项目。
核心组件:
| 组件 | 作用 |
|——————–|——————————|
| @Entity
| 定义数据库表结构 |
| @Dao
| 定义数据操作接口 |
| @Query
| 自定义SQL查询 |
| RoomDatabase
| 数据库实例管理类 |
示例代码:
@Entity(tableName = "user") public class User { @PrimaryKey public int id; public String name; } @Dao public interface UserDao { @Insert(onConflict = OnConflictStrategy.REPLACE) void insert(User user); @Query("SELECT FROM user") LiveData<List<User>> getAllUsers(); }
高性能对象数据库:Realm
Realm是一个面向对象的数据库,支持跨平台,性能优于SQLite。
特点:
- 零拷贝:数据以对象形式直接操作,无需转换。
- 多线程支持:自动处理线程间数据同步。
- 实时更新:数据变更可立即通知UI。
适用场景:
- 频繁读写操作的高性能需求。
- 需要实时数据同步的应用场景。
示例代码:
Realm realm = Realm.getDefaultInstance(); realm.executeTransaction(r -> { User user = r.createObject(User.class, 1); // 自动创建主键为1的对象 user.name = "John"; });
云数据库:Firebase Firestore
Firebase提供的NoSQL云数据库,适合需要实时同步和后端服务的应用。
特点:
- 离线支持:自动同步本地与云端数据。
- 实时监听:支持数据变化监听(类似WebSocket)。
- 全平台覆盖:不仅限于Android,支持Web/iOS。
适用场景:
- 需要快速搭建后端的服务。
- 跨平台应用的数据存储。
示例代码:
FirebaseFirestore db = FirebaseFirestore.getInstance(); Map<String, Object> user = new HashMap<>(); user.put("name", "Alice"); db.collection("users").add(user).addOnSuccessListener(documentReference -> { Log.d("Firestore", "Document added with ID: " + documentReference.getId()); });
数据库对比表格
特性 | SQLite | Room | Realm | Firestore |
---|---|---|---|---|
类型安全 | 否 | 是 | 是 | 否 |
性能 | 中等 | 接近SQLite | 高 | 依赖网络 |
实时同步 | 否 | 否 | 局部实时 | 是(云端) |
学习成本 | 高(SQL) | 中 | 低 | 低 |
最佳场景 | 简单存储 | 复杂架构 | 高性能需求 | 跨平台云服务 |
相关问题与解答
问题1:如何根据项目需求选择数据库?
解答:
- 优先内置:若功能简单且对性能要求低,直接使用SQLite。
- 追求效率:高频读写或复杂查询选Room(类型安全)或Realm(极致性能)。
- 需要云端:选Firestore,尤其适合需要实时同步的社交/协作类应用。
- 混合使用:本地用Room/Realm,云端用Firestore,通过同步机制结合。
问题2:Room与Realm能否共存?数据如何迁移?
解答:
- 共存场景:可以同时集成,Room适合结构化数据,Realm适合频繁变更的对象。
- 迁移方法:
- 从Room迁移到Realm:遍历Room数据,逐条写入Realm。
- 从Realm迁移到Room:导出Realm数据为JSON,再解析导入Room。
- 注意:两者数据模型不同,需确保字段匹配,避免数据