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

安卓开发数据库交互

安卓数据库交互基础

安卓开发中常用的数据库包括 SQLite(轻量级关系型数据库)和 Room(基于SQLite的ORM框架),以下是两者的核心特点对比:

特性 SQLite Room
操作方式 原生API,需手写SQL语句 通过注解生成代码,面向对象操作
编译时检查 支持(如字段类型匹配)
性能优化 需手动管理 内置预编译语句、异步操作支持
最佳适用场景 简单数据存储、快速原型开发 复杂数据结构、多表关联、团队协作

SQLite数据库操作步骤

  1. 创建/打开数据库

    SQLiteOpenHelper helper = new SQLiteOpenHelper(context, "db_name", null, version) {
        @Override
        public void onCreate(SQLiteDatabase db) {
            // 创建表:CREATE TABLE...
        }
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // 升级表结构:ALTER TABLE...
        }
    };
    SQLiteDatabase db = helper.getWritableDatabase();
  2. 增删改查操作

    • 插入数据
      ContentValues values = new ContentValues();
      values.put("column1", "value1");
      db.insert("table_name", null, values);
    • 查询数据
      Cursor cursor = db.query("table_name", columns, "condition", args, null, null, null);
      // 遍历cursor读取数据
    • 更新数据
      ContentValues values = new ContentValues();
      values.put("column1", "new_value");
      db.update("table_name", values, "condition", args);
    • 删除数据
      db.delete("table_name", "condition", args);
  3. 关闭数据库

    db.close();

Room框架使用指南

  1. 定义实体类

    @Entity(tableName = "user")
    public class User {
        @PrimaryKey(autoGenerateId = true)
        public int id;
        @ColumnInfo(name = "name")
        public String name;
        // 其他字段...
    }
  2. 创建DAO接口

    @Dao
    public interface UserDao {
        @Insert
        void insert(User user);
        @Query("SELECT  FROM user WHERE id = :userId")
        User getUserById(int userId);
        @Update
        void update(User user);
        @Delete
        void delete(User user);
    }
  3. 配置数据库

    @Database(entities = {User.class}, version = 1)
    public abstract class AppDatabase extends RoomDatabase {
        public abstract UserDao userDao();
    }
  4. 使用数据库

    AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app_db").build();
    UserDao userDao = db.userDao();
    userDao.insert(new User(0, "Alice")); // 插入数据

ContentProvider数据共享

  • 作用:跨应用或跨进程共享数据(如联系人、文件等)。
  • 核心方法
    • query():读取数据
    • insert():添加数据
    • update():修改数据
    • delete():删除数据
  • 示例:调用系统通讯录
    Uri uri = Uri.parse("content://contacts/people");
    ContentResolver resolver = getContentResolver();
    Cursor cursor = resolver.query(uri, null, null, null, null);
    // 处理查询结果

性能优化建议

问题 解决方案
主线程操作数据库卡顿 使用 AsyncTaskThreadRoomRxJava/LiveData 异步处理
数据库文件过大 按需分表、定期清理无用数据
频繁读写冲突 使用事务(beginTransaction())批量操作

问题与解答

问题1:Room相比SQLite的优势是什么?

解答

  1. 编译时验证:Room在编译阶段检查SQL语句和字段类型,避免运行时错误。
  2. 抽象层级:通过DAO接口和实体类隐藏SQL细节,代码更简洁。
  3. 内置功能:支持LiveData实时监听、RxJava异步流,简化开发流程。

问题2:如何在多线程中安全操作数据库?

解答

  1. SQLite:使用 synchronized 关键字或 SQLiteDatabase.yieldIfCongested() 让出锁。
  2. Room:直接调用DAO方法(Room内部已处理线程安全),或配合 LiveData/Flow 实现观察者模式
0