Android-ROOM组件

ROOM

本文介绍了 ROOM 数据库的基本概念和使用方法。

ROOM 数据库

一个database可以同时存在: N个@DAO, N个@Entity, 1个@Database, 1个DBEngine

查询回调的两种方式

Java 8或更高版本,推荐使用 Consumer 接口的方法。

使用 Consumer 接口

Consumer 接口是 Java 8 中引入的函数式接口的一部分。 这种方式允许直接在调用方法时定义对结果的处理逻辑,通常是通过一个 lambda 表达式或方法引用。

特点:

灵活性: 直接在调用点定义如何处理数据。 简洁性: 使用 lambda 表达式可以使代码更加简洁和直观。 依赖于 Java 8: 依赖于 Java 8 的特性,如函数式接口和 lambda 表达式。

public void queryAllDatas(DataQueryCallback callback) {
        databaseExecutor.execute(() -> {
            List<Data> allDatas = dataDao.getAllDatas();
            // 确保回调在主线程上执行(如果涉及UI操作)
            new Handler(Looper.getMainLooper()).post(() -> callback.onDataRetrieved(allDatas));
            // 直接在后台线程处理数据
            callback.onDataRetrieved(allDatas);
        });
    }

// 另外的接口文件
public interface DataQueryCallback {
    void onDataRetrieved(List<Data> dataList);
}

// 使用
DBEngine dbEngine = new DBEngine(requireContext());
dbEngine.queryAllDatas(dataList -> {
    // 在此处处理和使用 dataList       
});

使用自定义回调接口

定义一个自定义的回调接口 (DataQueryCallback),并在执行数据库操作的类中使用它。 这种方式更传统,通常在 Java 8 之前的代码中更常见。

特点:

结构化: 通过定义一个专用的回调接口,使得代码的结构更加清晰。 可重用性: 如果多个地方需要使用相同的回调逻辑,这种方式可以提高代码的可重用性。 适用性更广: 不依赖于 Java 8,可以在更老的 Java 版本中使用。

public void querySingleAccountData(String username, Consumer<AccountData> callback) {
        databaseWriteExecutor.execute(() -> {
            AccountData accountData = accountDataDao.getSingleAccountData(username);
            callback.accept(accountData);
        });
    }

// 使用
dbEngine.querySingleAccountData(username, accountData -> {
            if (accountData != null) {
                // 这里处理查询到的 AccountData
                // 注意:这可能在后台线程上执行,如果需要更新UI,请确保在主线程上运行
                runOnUiThread(() -> {
                    // 更新UI,例如显示账户数据
                });
            }
        });