上一篇
安卓开发自带数据库
- 行业动态
- 2025-04-22
- 3
安卓开发自带数据库详解
SQLite数据库
基本概念
SQLite是安卓系统内置的轻量级关系型数据库,基于SQL标准,支持事务、索引、视图等特性,无需额外安装,可直接在安卓应用中使用。使用方法
- 创建/打开数据库:通过
SQLiteOpenHelper
类管理数据库创建与升级。SQLiteOpenHelper helper = new SQLiteOpenHelper(context, "db_name", null, version) { @Override public void onCreate(SQLiteDatabase db) { // 创建表 } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 升级表逻辑 } }; SQLiteDatabase db = helper.getWritableDatabase();
- CRUD操作:通过
SQLiteDatabase
的execSQL()
或rawQuery()
方法执行SQL语句。// 插入数据 db.execSQL("INSERT INTO table_name (col1, col2) VALUES (?, ?)", new Object[]{val1, val2}); // 查询数据 Cursor cursor = db.rawQuery("SELECT FROM table_name", null);
- 创建/打开数据库:通过
优缺点
- 优点:轻量级、无需依赖、直接操作SQL灵活。
- 缺点:需手动处理线程安全、SQL语法易出错、缺乏对象映射。
Room持久化库
基本概念
Room是安卓官方推荐的数据库抽象层,基于SQLite构建,提供编译时验证、流畅API和活性数据(LiveData)支持。核心组件
- Entity(实体类):定义数据库表结构。
@Entity(tableName = "user") public class User { @PrimaryKey(autoGenerateId = 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(数据库类):封装数据库实例。
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
- Entity(实体类):定义数据库表结构。
优势
- 编译时检查SQL正确性,减少运行时错误。
- 支持
LiveData
和RxJava
,简化数据观察与异步操作。 - 自动生成
DAO
实现类,减少模板代码。
SQLite与Room对比
特性 | SQLite | Room |
---|---|---|
线程安全 | 需手动管理 | 自动处理(允许多线程调用) |
编译时检查 | 无 | 支持(通过注解) |
对象映射 | 无 | 实体类自动映射表结构 |
活性数据支持 | 无 | 内置LiveData 和Flowable |
学习成本 | 低(直接SQL) | 中(需理解注解和抽象层) |
相关问题与解答
问题1:为什么推荐使用Room而不是直接操作SQLite?
解答:
Room通过抽象层解决了SQLite的几大痛点:
- 编译时验证:
@Query
等注解会在编译阶段检查SQL语法,避免运行时错误。 - 减少模板代码:自动生成
DAO
实现类,无需手写CRUD
方法。 - 活性数据支持:直接返回
LiveData
或Flowable
,方便与UI层绑定。 - 线程安全:允许在任意线程调用数据库方法,内部自动处理并发。
问题2:Room如何支持多线程和异步操作?
解答:
- 多线程支持:Room的
Database
类默认支持多线程调用,内部通过Executor
处理并发。 - 异步操作:
- 使用
LiveData
:@Query("SELECT FROM user") LiveData<List<User>> getUsers()
,数据变更自动通知UI。 - 使用
RxJava
:@Query("SELECT FROM user") Single<List<User>> getUsers()
,结合Schedulers
切换线程。 - 使用
Kotlin Coroutines
:@Query("SELECT FROM user") suspend fun getUsers(): List<User>
,在协程中
- 使用