Android 将数据插入房间数据库时的ConcurrentModificationException
我基本上是想在我的房间数据库中保存一个截击响应,这样我以后可以检索它供脱机使用,但每次我启动我的应用程序时,我都会遇到这个异常,我尝试了很多方法来解决它,但对我来说没有任何效果,任何帮助都将不胜感激。多谢各位Android 将数据插入房间数据库时的ConcurrentModificationException,android,Android,我基本上是想在我的房间数据库中保存一个截击响应,这样我以后可以检索它供脱机使用,但每次我启动我的应用程序时,我都会遇到这个异常,我尝试了很多方法来解决它,但对我来说没有任何效果,任何帮助都将不胜感激。多谢各位 String api_keys = "MyApiKey" + awayid; JsonObjectRequest jsonObjectRequest2 = new JsonObjectRequest(Request.Method.GET, api_keys, null, new Resp
String api_keys = "MyApiKey" + awayid;
JsonObjectRequest jsonObjectRequest2 = new JsonObjectRequest(Request.Method.GET, api_keys, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray jsonArray2 = response.getJSONArray("teams");
for (int i = 0; i < jsonArray2.length(); i++) {
JSONObject jsonObject2 = jsonArray2.getJSONObject(i);
String awaylogo = jsonObject2.getString("strTeamBadge");
modelList.add(new Model(eventid,myround, date, hometeam, awayteam, homelogo, awaylogo, homescore,
awayscore, stadium, "Details", mytime));
new Thread(new Runnable() {
@Override
public void run() {
ApplicationDatabase database = DatabaseClient.getInstance(getApplicationContext()).getApplicationDatabase();
database.modelDao().insert(modelList); /// here it is the problem in this line
}
}).start();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, error -> {});
String api_keys=“MyApiKey”+awayid;
JsonObjectRequest jsonObjectRequest2=新的JsonObjectRequest(Request.Method.GET,api_键,null,new Response.Listener()){
@凌驾
公共void onResponse(JSONObject响应){
试一试{
JSONArray jsonArray2=response.getJSONArray(“团队”);
for(int i=0;i{});
***这是我的刀
@Dao
public interface modelDAO {
@Query("SELECT * FROM Model ")
List<Model> listAll();
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(List<Model> model);
}
@Dao
公共接口模型{
@查询(“从模型中选择*)
List listAll();
@插入(onConflict=OnConflictStrategy.REPLACE)
无效插入(列表模型);
}
因为在for循环中启动了大量线程。
在for循环之后移动新线程。解决方案实际上是将一个模型对象传递到my room db而不是模型列表,因此希望此答案对其他人有所帮助。在将数据插入数据库时,您是否在任何位置修改数据对象?如果是这种情况,错误可能是由不同线程并行修改同一变量引起的。或者,即使您在插入原始数组源时从原始数组源中删除了内容,也会引发此错误。文件室插入操作是一种异步操作。如果使用协同程序运行插入,则可以在invokeOnCompletion块中获得完成。否则,如果您真的需要在不等待完成的情况下修改对象,则解决方案非常简单。您可以将变量modelList复制到新变量,并将新的局部变量用作insert调用的参数 例如:(科特林) 例如:(爪哇)
List localCopy=modelList
AppDatabase.getDatabase(context).feedDataDao().insertAll(localCopy).size
我将代码移到catch exception的正上方,但仍然收到相同的错误,我试图将其移出截击请求,没有保存任何数据,我不知道我做错了什么
val localCopy = modelList
CoroutineScope(Dispatchers.IO).launch {
AppDatabase.getDatabase(context).feedDataDao().insertAll(localCopy).size
}.invokeOnCompletion {
Log.d("Inserted all items")
}
List<MyDataType> localCopy = modelList
AppDatabase.getDatabase(context).feedDataDao().insertAll(localCopy).size