ConcurrentModification将数据插入房间 DB 时的异常



我基本上是尝试在我的房间数据库中保存一个凌空响应,以便以后可以检索它以供离线使用,但是每次启动我的应用程序时,我都会收到此异常。

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 -> {});

这是我的道

@Dao
public interface  modelDAO {
@Query("SELECT * FROM Model ")
List<Model> listAll();

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(List<Model> model);
}

因为你在 for 循环中启动了很多线程。 将新线程移动到 for 循环之后。

在将数据插入数据库时,您是否在任意位置修改数据对象?如果是这种情况,错误可能是由不同线程对同一变量的平行修改引起的。或者,即使您在插入原始数组源时从原始数组源中删除内容,也可以抛出此内容。房间插入操作是异步操作。如果使用协程运行插入,则可以在 invokeOnCompletion块中获取完成。否则,如果您确实需要修改对象而不等待完成,解决方案非常简单。您可以将变量modelList复制到新变量,并将新的局部变量用作插入调用的参数。

例如:(科特林(

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

将模型对象传递给我的房间数据库而不是模型列表。

相关内容

最新更新