Android 在使用Cursor时踩的坑。

关键字:Cursor、moveToFitst()、getString()、

今儿写获取数据库数据时候遇到了使用cursor.getString()的方法,结果运行的时候app直接崩溃。

 //获取所有log信息
    public List<String> getAllLog(String UserID){
        List<String> list = new ArrayList<>();
        String LogRowInfo = "";
        String sql1 = "select * from LogTable where UserID=?"; //查询账号署下的日志信息
        SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();
        Cursor cursor = sqLiteDatabase.rawQuery(sql1,new String[]{UserID});
        cursor.moveToFirst();
        cursor.moveToNext();
        //int LogIDIndex = cursor.getColumnIndex(COL_Serial);   //单条数据ID
        int LogUIDIndex = cursor.getColumnIndex(COL_UserID);   //用户ID
        int LogDNameIndex = cursor.getColumnIndex(COL_DName);  //设备名字
        int LogTimeIndex = cursor.getColumnIndex(COL_Time);  //操作时间
        int LogOpertypeIndex = cursor.getColumnIndex(COL_Opertype); //操作类型
        int LogResultIndex = cursor.getColumnIndex(COL_Result);  //操作结果
       
        String LogUID = cursor.getString(LogUIDIndex);
        String LogDName = cursor.getString(LogDNameIndex);
        String LogTime = cursor.getString(LogTimeIndex);
        String LogOpertype = cursor.getString(LogOpertypeIndex);
        String LogResult = cursor.getString(LogResultIndex);
        if(cursor.moveToFirst()) {
            do {
                //用户ID:1001于2023-12-01-24:14修改厨房传感器 结果:成功
                LogRowInfo = String.format("用户ID:%s 于%s%s%s 结果:%s", LogUID, LogTime, LogOpertype, LogDName, LogResult);
                list.add(LogRowInfo);
            }
            while (cursor.moveToNext());
        }
        cursor.close();
        return list;
    }

我寻思也用了moveToFirst(); getString()也没问题,咋出错了呢?后面查了半天才搞懂。

简单来说就是使用cursor的时候,会有个指针一样的东西,在我使用getColumnIndex()方法的时候,指针已经跳到其它地方了,而在getColumnIndex()使用完后,这个指针并不会自己复位。所以在这种情况下,接下去使用getString()方法便会出错溢出。

所以修改办法是在使用完getColumnIndex()后加一句cursor.moveToFirst();将指针复位,然后再使用getString()。

//int LogIDIndex = cursor.getColumnIndex(COL_Serial);   //单条数据ID
        int LogUIDIndex = cursor.getColumnIndex(COL_UserID);   //用户ID
        int LogDNameIndex = cursor.getColumnIndex(COL_DName);  //设备名字
        int LogTimeIndex = cursor.getColumnIndex(COL_Time);  //操作时间
        int LogOpertypeIndex = cursor.getColumnIndex(COL_Opertype); //操作类型
        int LogResultIndex = cursor.getColumnIndex(COL_Result);  //操作结果
        cursor.moveToFirst();
        String LogUID = cursor.getString(LogUIDIndex);
        String LogDName = cursor.getString(LogDNameIndex);
        String LogTime = cursor.getString(LogTimeIndex);
        String LogOpertype = cursor.getString(LogOpertypeIndex);
        String LogResult = cursor.getString(LogResultIndex);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值