检查空光标使程序崩溃

我在检查游标是否为空时遇到了一个严重问题,游标从表中加载了一些数据,如果它返回null值,它就会崩溃,我尝试了几种解决方案,例如(if(c == null))( == 0)),我什至尝试了c.isBeforeFirst()

光标的功能是:

fun getarrayList1(dbHelper: DBHelper,type: Int): ArrayList<String> {
    var rv = ArrayList<String>()
    var query = ""
    val db = dbHelper.writableDatabase
    if (type == TYPE_DH) {
        query = "SELECT " + DBHelper.COL_45 + " FROM " + DBHelper.TABLE_HOL + " WHERE (" + DBHelper.COL_43 + " LIKE '%" + sel2 + "%') AND (" + DBHelper.COL_44 + " LIKE '%" + sel3 + "%')"
        } else {
    }
    Log.d("GetaRRAYLIST","Query is \n\t" + query)
    val c: Cursor = db.rawQuery(query,null)
    c.moveToFirst()
    if (c.isBeforeFirst()) {
        getnull(dbHelper)
    } else {
        while (c.moveToNext()) {
            rv.add(c.getString(0))
            textView13.text = rv.toString()

            return rv
        }
    }
    c.close()
    return rv
}

在这里,我试图检查光标是否返回null值,然后程序将执行另一个功能:

fun getnull(dbHelper: DBHelper) : ArrayList<String> {
    var rv = ArrayList<String>()
    var query1 = ""
    val db = dbHelper.writableDatabase
    query1 = "SELECT " + DBHelper.COL_45 + " FROM " + DBHelper.TABLE_HOL + " WHERE " + DBHelper.COL_43 + " LIKE '%" + sel2 + "%'"
    val c2 = db.rawQuery(query1,null)
    textView13.text = "0"
    showToast("هذا السيد / " + sel3 + " لم يحصل على أي أجازات سابقة")
    c2.close()
    return rv
}

在我的程序中,我试图保存员工休假的数据。在我的页面中,我记得有两列(第一列是“雇员姓名”,第二列是他休假的次数)。在主函数中,选择(+ DBHelper.COL_44 +“ LIKE'%” + sel3 +“%'”)的一部分,我知道它将返回空值,因为它将返回未使用的人的名字一个假期了。

所以有人可以帮助我解决该问题吗?

sl819532666 回答:检查空光标使程序崩溃

您可以按照@ComeIn的建议检查cursor.Count

if (cursor.Count > 0) {
      cursor.MoveToFirst();
}

然后在finally

上关闭光标
finally  {
    if(cursor != null) {
        cursor.Close();
    } 
}
,

替换此

class PYBIND11_EXPORT Point {
  ...
}

类似

c.moveToFirst()
if (c.isBeforeFirst()) {
    getnull(dbHelper)
} else {
    while (c.moveToNext()) {
        rv.add(c.getString(0))
        textView13.text = rv.toString()

        return rv
    }
}
c.close()
return rv

原因:

  • if (c.moveToFirst()) { do { rv.add(c.getString(0)) } while (c.moveToNext()) textView13.text = rv.toString() } else { rv = getnull(dbHelper) } c.close() return rv 始终将行移至第一行,无论该行是否存在。 moveToFirst()因此返回false。您可以检查isBeforeFirst()的返回值以查看光标是否指向有效行。

  • moveTo..()后跟moveToFirst()将跳过第一条结果行。因此,moveToNext()-do将在读取行后移动光标。

  • 不需要在每个循环迭代中更新相同的textview,可以在循环之后进行。

  • 您没有对while结果进行任何操作

  • 最好在代码的所有分支中getnull()使用光标。

本文链接:https://www.f2er.com/3087725.html

大家都在问