其他分享
首页 > 其他分享> > 我可以在Android的多个线程中使用同一RoomDatabase对象吗?

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

作者:互联网

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

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

解决方法:

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

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

标签:android-room,multithreading,java,android
来源: https://codeday.me/bug/20191110/2014674.html