我可以在 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
注释,以指示整个方法应在单个方法中执行交易。
我在 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
注释,以指示整个方法应在单个方法中执行交易。