我可以在 Android 上的多个线程中使用同一个 RoomDatabase 对象吗?

Can I use the same RoomDatabase object from multiple threads on Android?

我在 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);
                }
            }
        }
    });

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

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

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