gpt4 book ai didi

java - ConcurrentModificationException 房间 Android

转载 作者:行者123 更新时间:2023-12-01 13:46:39 36 4
gpt4 key购买 nike

我在我的应用程序中使用 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 对象上引起的。在这种情况下,错误消息woule 如下所示。

 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 复制到一个新变量,并将新的局部变量用作插入调用的参数。

例如:( Kotlin )
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

关于java - ConcurrentModificationException 房间 Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50737280/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com