【问题标题】:ConcurrentModificationException Room AndroidConcurrentModificationException 房间 Android
【发布时间】:2018-11-17 03:15:36
【问题描述】:

我在我的应用程序中使用 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);

【问题讨论】:

    标签: java android android-room


    【解决方案1】:

    如果您尝试在分页列表中插入数据,这是一个典型的场景。由于您没有粘贴错误日志,我假设错误是由 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
    

    【讨论】:

    • 我的也是同样的问题,但这个解决方案对我不起作用。请查看stackoverflow.com/questions/68082863/…
    • 很好解释,谢谢!就我而言,我正在删除数据并同时加载它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2020-05-17
    • 1970-01-01
    相关资源
    最近更新 更多