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

安卓开发自带数据库

安卓开发自带数据库详解

SQLite数据库

  1. 基本概念
    SQLite是安卓系统内置的轻量级关系型数据库,基于SQL标准,支持事务、索引、视图等特性,无需额外安装,可直接在安卓应用中使用。

  2. 使用方法

    • 创建/打开数据库:通过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操作:通过SQLiteDatabaseexecSQL()rawQuery()方法执行SQL语句。
      // 插入数据
      db.execSQL("INSERT INTO table_name (col1, col2) VALUES (?, ?)", new Object[]{val1, val2});
      // 查询数据
      Cursor cursor = db.rawQuery("SELECT  FROM table_name", null);
  3. 优缺点

    • 优点:轻量级、无需依赖、直接操作SQL灵活。
    • 缺点:需手动处理线程安全、SQL语法易出错、缺乏对象映射。

Room持久化库

  1. 基本概念
    Room是安卓官方推荐的数据库抽象层,基于SQLite构建,提供编译时验证、流畅API和活性数据(LiveData)支持。

  2. 核心组件

    • 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();
      }
  3. 优势

    • 编译时检查SQL正确性,减少运行时错误。
    • 支持LiveDataRxJava,简化数据观察与异步操作。
    • 自动生成DAO实现类,减少模板代码。

SQLite与Room对比

特性 SQLite Room
线程安全 需手动管理 自动处理(允许多线程调用)
编译时检查 支持(通过注解)
对象映射 实体类自动映射表结构
活性数据支持 内置LiveDataFlowable
学习成本 低(直接SQL) 中(需理解注解和抽象层)

相关问题与解答

问题1:为什么推荐使用Room而不是直接操作SQLite?

解答
Room通过抽象层解决了SQLite的几大痛点:

  1. 编译时验证@Query等注解会在编译阶段检查SQL语法,避免运行时错误。
  2. 减少模板代码:自动生成DAO实现类,无需手写CRUD方法。
  3. 活性数据支持:直接返回LiveDataFlowable,方便与UI层绑定。
  4. 线程安全:允许在任意线程调用数据库方法,内部自动处理并发。

问题2:Room如何支持多线程和异步操作?

解答

  1. 多线程支持:Room的Database类默认支持多线程调用,内部通过Executor处理并发。
  2. 异步操作
    • 使用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>,在协程中
0