【问题标题】:Can I use the same RoomDatabase object from multiple threads on Android?我可以在 Android 上的多个线程中使用相同的 RoomDatabase 对象吗?
【发布时间】:2017-11-28 06:15:31
【问题描述】:

我在 Android 上使用 Room 持久性库。目前,我每次访问数据库时都有一些额外的同步代码。我想知道这段代码是否必要。

我目前作为单例访问数据库。 这就是我目前将对象插入数据库的方式:

    // Insert values into DB
    final AppDatabase db = AppDatabase.get(this);
    AsyncTask.execute(new Runnable() {
        @Override
        public void run() {
            synchronized (db) {
                for (WorkOrder wo : workOrderList) {
                    db.workOrderDao().insertAll(wo);
                }
            }
        }
    });

我需要将插入代码放在同步块中吗?

【问题讨论】:

    标签: java android multithreading android-room


    【解决方案1】:

    RoomDatabase 包装了标准的SQLiteDatabase,这是相当线程安全的,所有工作都在事务中完成。

    我不太担心synchronized,而更多地担心事务,因为目前,这项工作是在 N 个事务中完成的(每个 WorkOrder 一个)。我会有一个insertAll(List<WorkOrder>),所以您可以在一个事务中执行此操作。或者,如果出于某种原因不切实际,请将循环移至 @Dao 类中自己的方法中,并带有 @Transaction 注释,以指示整个方法应在单个事务中执行。

    【讨论】:

    • 我们是否必须使用 FlowableMaybeCompletable 等注释 CRUD 方法才能使其工作?
    • @IgorGanapolsky:@Transaction 注释不需要任何返回类型,更不用说反应类型了。否则,我不太确定您所指的“this”是什么。
    • 我指的是OP的代码:db.workOrderDao().insertAll()
    • @IgorGanapolsky:如果你真的要使用 OP 的代码,insertAll() 需要同步。否则,synchronized(db) 部分毫无意义。
    • @CommonsWare:“我会有一个 insertAll(List),因此您可以在一个事务中执行此操作”。这是否意味着 insert(List) 会自动放入事务中?
    猜你喜欢
    • 2018-01-31
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多