insert和delete等操作要注意的一点
今天测试提出了一个bug,发布多次消息在查看的时候,位于中间的数据会丢失……排查掉服务器的问题之后,我把注意点放到了sqlite插入语句上面,果然发现了问题。
问题代码
/**
* 插入数据
*
* @param data
* @return
*/
public void insert(Info info) {
SQLiteDatabase database = sqlite.getReadableDatabase();
database.beginTransaction();
String showTime = info.getShowTime() + "";
try {
ContentValues values = new ContentValues();
values.put("test", value.getTest());
database.insert(LogSqlite.TABLE_NAME, null, values);
database.setTransactionSuccessful();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
database.endTransaction();
}
database.close();
}
相应的,他的用法是这样的:
for (Info message : messages) {
DatabaseHelper.getInstance(mActivity).insert(message);
}
问题就在这里,这样就会导致database频繁的开启关闭……这样……中间的事务就会丢失……对应的数据也就插入不进去了
解决方法
让for循环只循环insert语句,或者拼接一个超长的insert语句……
public void insertList(List<Info> infos) {
SQLiteDatabase database = sqlite.getReadableDatabase();
database.beginTransaction();
for (int i = 0; i < infos.size(); i++) {
Info info = infos.get(i);
ContentValues values = new ContentValues();
values.put("test", info.getTest());
database.insert(LogSqlite.TABLE_NAME, null, values);
}
try {
database.setTransactionSuccessful();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
database.endTransaction();
}
database.close();
}
当然到时候只需要
DatabaseHelper.getInstance(mActivity).insertList(messages);
虽说这个点是常识,不过下回接手别人代码的时候遇到类似问题不会一脸懵逼……记一下