关于sqlite的一个操作注意点

    xiaoxiao2021-03-25  75

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

    虽说这个点是常识,不过下回接手别人代码的时候遇到类似问题不会一脸懵逼……记一下

    转载请注明原文地址: https://ju.6miu.com/read-23022.html

    最新回复(0)