Android Room 通用 DAO

2024-04-12

美好的一天,Stack,我正在开发一个使用 Android Room 1.0.0 Alpha 5 的 Android 项目,我面临的主要问题是每次我需要从 Room 调用其中一个 DAO 时,我都需要执行类似的操作这:

活动.java:

...
AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "Storage").build();
Table1 table = new Table1();
table.setId(1);
table.setName("Hello");
new AccessDB().execute(1);

/* Generic AccessDB needed */
private class AccessDB extends AsyncTask<Integer,Void,List<Table1>> {

    @Override
    protected List<Table1> doInBackground(Integer... param) {
        switch(param[0]) {
            case 1:
                return db.Table1DAO().create();
            case 2:
                return db.Table1DAO().read();
        }
        return new ArrayList<>();
    }

    @Override
    protected void onPostExecute(List<Table1> list) {
        processData(list);
    }
}
...

我知道我可以从主线程访问 Room DB,这会缩小代码,但我认为这不是一个好的做法,因为这会在每次必须处理数据时锁定活动。

因此,如果我需要从“Table2”插入或读取数据,我将不得不再次执行相同的操作,如果我可以将实体类型转换为“T”或类似的泛型,然后创建一个泛型,那就太好了“AccessDB”。 但由于我对 Java 不太熟悉......我目前正在为此苦苦挣扎。

这是实例的一些其他代码。

应用程序数据库.java:

@Database(entities = {Table1.class, Table2.class, Table3.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract Table1DAO Table1DAO();
    public abstract Table2DAO Table2DAO();
    public abstract Table3DAO Table3DAO();
}

表1.java:

@Entity
public class Table1 {
    /* setters & getters */
    @PrimaryKey(autoGenerate = true)
    private int id;
    private String name;
}

表1DAO.java:

@Dao public interface Table1DAO {
    @Query("SELECT * FROM Table1")
    List<Table1> read(Table1 table);

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    List<Long> create(Table1... table);
}

感谢大家的帮助。


您可以使用继承并创建一个BaseDao这将由您的所有孩子实施Dao。这样你就不需要一次又一次地编写通用方法。

interface BaseDao<T> {

/**
 * Insert an object in the database.
 *
 * @param obj the object to be inserted.
 */
@Insert
fun insert(obj: T)

/**
 * Insert an array of objects in the database.
 *
 * @param obj the objects to be inserted.
 */
@Insert
fun insert(vararg obj: T)

/**
 * Update an object from the database.
 *
 * @param obj the object to be updated
 */
@Update
fun update(obj: T)

/**
 * Delete an object from the database
 *
 * @param obj the object to be deleted
 */
@Delete
fun delete(obj: T)
}

了解更多相关信息:https://gist.github.com/florina-muntenescu/1c78858f286d196d545c038a71a3e864#file-basedao-kt https://gist.github.com/florina-muntenescu/1c78858f286d196d545c038a71a3e864#file-basedao-kt

原始作品归功于弗洛琳娜。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Room 通用 DAO 的相关文章

随机推荐

  • 无法修改 Controls 集合,因为控件包含代码块(即 <% ... %>)

    我正在尝试在 C 中创建动态元标记 但出现以下错误 无法修改 Controls 集合 因为控件 包含代码块 即 这是我添加的代码 HtmlMeta meta new HtmlMeta meta Name keywords meta Cont
  • 捕获 IllegalArgumentException 的最佳方法是什么

    什么时候最好使用这种类型的异常 如果捕获到这样的异常 是否可以正确处理它 catch Exception e 还是需要明确捕获 catch IllegalArgumentException e It would会被第一个捕获 但许多其他异常
  • 如何传入带有泛型类型参数的 func?

    我喜欢向方法发送通用类型转换器函数 但我不知道该怎么做 这是无效的语法 解释了我想要实现的目标 问题是我不知道如何与我的 func 一起指定泛型类型 public void SomeUtility Func
  • 为什么继承不能按照我认为应该的方式工作?

    我遇到了一些继承问题 因为我有一组相互关联的抽象类 需要一起重写它们才能创建客户端实现 理想情况下 我想做类似以下的事情 abstract class Animal public Leg GetLeg abstract class Leg
  • Excel VBA 检查插件是否已安装但未打开

    我有以下代码来检查所需的插件是否已安装 可用 然后再从当前上下文调用该插件中的脚本 Function IsAddinEnabled addinName as string As Boolean IsAddinEnabled True Dim
  • 资产目录与文件夹参考:何时使用其中之一?

    我可以将文件放入Assets xcassets或者我可以将文件放入文件夹引用 蓝色文件夹 中 我什么时候会选择其中之一而不是另一个 您可能应该使用资产目录 因为这就是 Apple 希望您今后使用的内容 工具将反映这一点 并且它们带来了许多优
  • 将 docker 根文件夹移动到新驱动器/分区

    我正在尝试将 var lib docker 文件夹从一个磁盘移动到另一个磁盘 因为它占用了太多空间 我不断遇到一些与权限相关的错误 根据这些问题 如何将 Docker 容器的映像移动到永久磁盘 https stackoverflow com
  • Spring-boot 启动 tomcat 上下文时出错。创建名称为“servletEndpointRegistrar”的 bean 时出错

    我是 spring boot 的新手 因此 在从 Spring Initializr 引导项目后 我尝试在 intellij 上运行它 但我在启动时遇到错误 以下是versions 爪哇 8春季启动 2 0 6我尝试过更改 spring b
  • 如何在字符串中用反斜杠美元替换美元字符

    我有一个像这样的字符串 String str aLnx5 bK C4EFg 我想换掉所有的美元 带有反斜杠美元的字符 为了得到 String expectedString aLnx5 bK C4EFg String str aLnx5 bK
  • 在ggplot2中绘制饼图

    我想绘制一个合适的饼图 然而 该网站之前的大部分问题都来自stat identity 如何绘制像图 2 这样的普通饼图 其角度与cut 我正在使用diamonds来自 ggplot2 的数据框 ggplot data diamonds ma
  • Go 中的 URL 生成器/查询生成器

    我感兴趣的是通过浏览器或 CLI 动态获取用户的参数作为输入 将这些参数传递给 REST API 调用 从而使用 Go 动态构建 URL 最终为我获取一些 JSON 数据 我想了解 Go 中的一些技术可以帮助我做到这一点 我认为一种理想的方
  • Ajax 调用提交处理程序 Jquery 验证

    我有一个具有多个选择下拉列表的表单name select 并且此表单是从 Jquery Validation 进行验证的 并且在成功验证后提交处理程序调用 Ajax 我想发送所有表单键和值也包括在数组表单中 这是我的代码 function
  • 如何删除核心数据持久存储

    我需要删除我的持久存储 逐个对象执行此操作并不实际 因为我有超过 100 000 个对象 我试过这个 IBAction resetDatabase id sender NSPersistentStore store persistentSt
  • 如何在C程序执行过程中显示自定义提示符?

    我正在尝试在 Linux 中使用 C 程序模拟终端 并且需要我的程序在程序执行时显示自定义提示 有没有办法使用我的 C 程序显示它 我总是可以尝试手动打印 My prompt 每一行 但我正在寻找更好的方法 另外 除了基本库之外 我无法使用
  • 那么为什么 i = ++i + 1 在 C++11 中定义良好呢?

    我见过other https stackoverflow com q 1860461 150634相似的问题 https stackoverflow com q 4336860 150634并阅读defect http www open s
  • JSON.parse 返回 [Object Object] 而不是值

    我的 API 返回 JSON 值 例如 UserName xxx Rolename yyy I need Username and RoleNamevalue seperatly 我尝试了 JSON parse 但它返回 Object Ob
  • 如何编辑表格数据 (ASP MVC)

    我需要能够在浏览器中编辑数据表 我在 MVCContrib 中看到有一个 HTML 帮助器来渲染表格 有用 但是如果我希望用户能够编辑该表怎么办 据我所知 这并没有帮助 解决这个问题的最佳方法是什么 传统的 FORM 里面有一个 TABLE
  • Azure IoT Hub设备消息结构和路由查询

    我使用了来自的 python 示例https learn microsoft com de de azure iot hub quickstart send telemetry python https learn microsoft co
  • 使用“VisualStudio.DTE.10.0”创建解决方案并添加项目

    我正在尝试创建 VS2010 解决方案并从独立应用程序 而不是加载项 添加项目 我可以创建 VS2010 的实例 但我无法确定如何正确创建项目 我只能找到如何使用 EnvDTE80 对象创建项目的示例 这稍后会导致异常 因为该项目文件的格式
  • Android Room 通用 DAO

    美好的一天 Stack 我正在开发一个使用 Android Room 1 0 0 Alpha 5 的 Android 项目 我面临的主要问题是每次我需要从 Room 调用其中一个 DAO 时 我都需要执行类似的操作这 活动 java App