我正在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
,它是相当线程安全的,所有工作都在事务中完成。
我不必担心synchronized
,而更多地关注事务,因为目前,这项工作是在N个事务中完成的(每个WorkOrder
一个)。我需要一个insertAll(List<WorkOrder>)
,因此您可以在一个事务中执行此操作。或者,如果出于某种原因不切实际,请将循环使用自己的方法(带有@Dao
批注)移动到@Transaction
类中,以指示整个方法应在单个事务中执行。