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

安卓应用开发数据库

安卓应用开发数据库详解


数据库选型

安卓开发中常用的数据库方案包括:
| 方案 | 特点 |
|—————|———————————————————————-|
| SQLite | 轻量级嵌入式数据库,安卓原生支持,适合小型数据存储,需手动管理线程。 |
| Room(Jetpack)| 基于SQLite的抽象层,提供编译时校验、流畅API,支持LiveData和RxJava。 |
| 其他(如Realm)| 第三方库,性能优化较好,但需额外集成。 |


SQLite基础

  1. 创建数据库
    通过SQLiteOpenHelper管理数据库版本和创建表:

    public class DBHelper extends SQLiteOpenHelper {
        private static final String CREATE_TABLE = "CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT)";
        public DBHelper(Context context) {
            super(context, "app.db", null, 1); // 数据库名称和版本号
        }
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_TABLE); // 创建表
        }
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // 处理数据库升级逻辑
        }
    }
  2. CRUD操作

    安卓应用开发数据库

    • 插入数据
      ContentValues values = new ContentValues();
      values.put("name", "Alice");
      db.insert("user", null, values);
    • 查询数据
      Cursor cursor = db.query("user", null, "id=?", new String[]{"1"}, null, null, null);
      if (cursor.moveToFirst()) {
          String name = cursor.getString(cursor.getColumnIndex("name"));
      }

Room框架

  1. 核心组件

    • Entity(实体类):映射数据库表。
      @Entity(tableName = "user")
      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 WHERE id = :id")
          User getUserById(int id);
      }
    • Database:封装数据库实例。
      @Database(entities = {User.class}, version = 1)
      public abstract class AppDatabase extends RoomDatabase {
          public abstract UserDao userDao();
      }
  2. 线程安全与异步操作
    Room默认禁止在主线程执行操作,可通过以下方式处理:

    • ExecutorService:手动管理线程。
    • LiveData:观察数据变化并自动切换线程。
    • RxJava:支持响应式编程(需添加依赖)。

数据访问对象(DAO)操作示例

操作类型 SQLite实现 Room实现(DAO接口)
插入 SQLiteDatabase.insert() @Insert void insert(User user)
更新 SQLiteDatabase.update() @Update void update(User user)
删除 SQLiteDatabase.delete() @Delete void delete(User user)
查询 SQLiteDatabase.query() @Query("SELECT FROM user") List<User> getAll()

数据库操作流程

  1. 初始化Room数据库
    AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app.db").build();
  2. 获取DAO实例
    UserDao userDao = db.userDao();
  3. 执行CRUD操作
    // 插入数据(需在子线程)
    userDao.insert(new User());

注意事项

  1. 线程管理
    • SQLite操作需避免在主线程执行,否则可能抛出异常。
    • Room强制要求异步操作,推荐使用AsyncTaskViewModel+LiveData
  2. 数据库迁移
    • 版本升级时需重写onUpgrade()方法(SQLite)或Migration类(Room)。
  3. 数据一致性
    • 使用事务保证多操作原子性(如db.beginTransaction())。

相关问题与解答

问题1:SQLite与Room的核心区别是什么?

解答

  • SQLite:需手动编写SQL语句,缺乏编译时校验,线程管理复杂。
  • Room:提供面向对象的API,编译时校验SQL正确性,内置线程安全支持,适合复杂项目。

问题2:Room如何实现多表关联查询?

解答

  1. 定义关联实体:使用@Relation注解。

    @Entity(tableName = "order")
    public class Order {
        @PrimaryKey(autoGenerate = true)
        public int id;
        public int userId;
    }
    @Entity(tableName = "user")
    public class User {
        @PrimaryKey(autoGenerate = true)
        public int id;
        public String name;
    }
    public class UserWithOrders {
        @Embedded
        public User user;
        @Relation(parentColumn = "id", entityColumn = "userId")
        public List<Order> orders;
    }
  2. 在DAO中定义查询

    @Transaction
    @Query("SELECT  FROM user WHERE id = :userId")
    UserWithOrders getUserWithOrders(int userId);
    • @Transaction保证多表查询的原子