我有一个方法在类中的sqlite中插入值.在主要活动中,我正在解析json值并尝试在循环中将值插入sqlite,因为我必须插入多行.但是只有一行被添加到数据库中.
public void addSession(String sessionname,String start_time,String end_time,String id) { sqliteDatabase db = this.getWritableDatabase(); try { db.beginTransaction(); String sql = "Insert into session (id,sessionname,start_time,end_time) values(?,?,?)"; sqliteStatement insert = db.compileStatement(sql); insert.bindString(1,id); insert.bindString(2,sessionname); insert.bindString(3,start_time); insert.bindString(4,end_time); insert.execute(); db.setTransactionSuccessful(); } catch (Exception e) { Log.w("Appet8:",e ); } finally { db.endTransaction(); } }
JSONObject jsonObject = new JSONObject(response); JSONArray foodsessions = jsonObject.getJSONArray("foodsessions"); for(int i=0;i<foodsessions.length();i++) { JSONObject session_object = foodsessions.getJSONObject(i); String session = session_object.getString("sessionname"); String start_time = session_object.getString("start_time"); String end_time = session_object.getString("end_time"); String session_id = session_object.getString("id"); db.addSession(session,end_time,session_id); }
解决方法
一个更好的结构是在方法之外创建一个db引用,并将其作为引用传递:
sqliteDatabase db = this.getWritableDatabase(); db.beginTransaction(); // your for loop db.setTransactionSuccessful(); db.endTransaction();
==============
请检查下面用于插入多行的内容:
// adb is sqliteOpenHelper JSONObject jsonObject = new JSONObject(response); JSONArray foodsessions = jsonObject.getJSONArray("foodsessions"); int length = foodsessions.length(); for (int i = 0; i < length; i++) { JSONObject o = foodsessions.getJSONObject(i); String session = session_object.getString("sessionname"); String start_time = session_object.getString("start_time"); String end_time = session_object.getString("end_time"); String session_id = session_object.getString("id"); sqliteDatabase db = adb.getWritableDatabase(); ContentValues newValues = new ContentValues(); newValues.put(adb.ATTRIBUTE_session,session); newValues.put(adb.ATTRIBUTE_start_time,start_time); newValues.put(adb.ATTRIBUTE_end_time,end_time); newValues.put(adb.ATTRIBUTE_session_id,session_id); long res = db.insertWithOnConflict(adb.TABLE_NAME,null,newValues,sqliteDatabase.CONFLICT_REPLACE); db.close(); }