关于sqlite的一个操作注意点

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值