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

Jon*_*man 5 java multithreading android android-room

我正在使用Android上的Room Persistence库。当前,每次访问数据库时,我都有一些额外的同步代码。我想知道此代码是否必要。

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

    // 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);
                }
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

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

Com*_*are 7

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

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