[英]ConcurrentModificationException Room Android
我在我的應用程序中使用 Room,在將數據插入我的數據庫時,有時會拋出ConcurrentModificationException
。 為什么會這樣?
我使用分頁 api,在每次 api 調用后,我將 dataList 插入到我的數據庫中
new Thread(new Runnable() {
@Override
public void run() {
appDatabase.dataDao().insertMultipleData(dataList);
}
}).start();
在哪里
appDatabase = Room.databaseBuilder(context, AppDatabase.class, AppDatabase.DATABASE_NAME)
.fallbackToDestructiveMigration()
.build();
插入操作
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertMultipleData(List<Data> dataList);
如果您嘗試在分頁列表中插入數據,這是一個典型的場景。 由於您尚未粘貼錯誤日志,因此我假設該錯誤是由 dataList 對象引起的。 在這種情況下,錯誤消息將如下所示。
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.next(ArrayList.java:860)
at androidx.room.EntityInsertionAdapter.insertAndReturnIdsArray(EntityInsertionAdapter.java:131)
at com.myApp.data.database.entities.FeedDataDao_Impl.insertAll(FeedDataDao_Impl.java:220)
如果是這種情況,則錯誤是由不同線程並行修改同一變量引起的。 在這種情況下,我假設您將數據插入數據庫,同時進行新的服務調用(分頁)以獲取更新相同數據對象的數據。 或者,即使您在插入原始數組源時從原始數組源中刪除內容,也可能會拋出此錯誤。 解決方案非常簡單。 您可以將變量dataList復制到新變量,並將新的局部變量用作插入調用的參數。
例如:(科特林)
val localCopy = dataList
CoroutineScope(Dispatchers.IO).launch {
AppDatabase.getDatabase(context).feedDataDao().insertAll(localCopy).size
}.invokeOnCompletion {
Log.d("Inserted all items")
}
例如:(Java)
List<MyDataType> localCopy = dataList
AppDatabase.getDatabase(context).feedDataDao().insertAll(localCopy).size
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.