【问题标题】:cursor.getCount always = 0cursor.getCount 始终 = 0
【发布时间】:2013-08-27 19:59:21
【问题描述】:

我需要实现一种算法来访问数据库以检查最后一个元素以计算新元素。当然,第一次是不可能的,因为数据库是空的,我得到了

IndexOutOfBoundsException) index 0 requested with a size of 0

为了避免这种情况,我尝试检查cursor.getCount==0,然后我引入了一个默认的第一个元素。问题是,即使我将它存储在数据库中,cursor.getCount 仍然是0。这是我的方法的代码:

public Measures getLastMeasure(String date) {
    SQLiteDatabase db = this.getReadableDatabase();

    Cursor cursor = db.query(TABLE_MEASURES, new String[] { KEY_ID,
            KEY_DATE, KEY_TIME_HOUR, KEY_TIME_MINUTE, KEY_BE_INTAKE,
            KEY_GLUCOSE, KEY_BOLUS, KEY_BASAL }, KEY_DATE + "=?",
            new String[] { date }, null, null, KEY_TIME_HOUR + " DESC, "
                    + KEY_TIME_MINUTE + " DESC", "1");
    if (cursor.getCount() == 0) {
        Measures m = new Measures("nodate", 0, 0, 0, 0, 0, 0);
        return m;
    } else {
        if (cursor != null)
            cursor.moveToFirst();

        Measures m = new Measures(Long.parseLong(cursor.getString(0)), // id
                cursor.getString(1), // date
                Integer.parseInt(cursor.getString(2)), // timeHour
                Integer.parseInt(cursor.getString(3)), // timeMinute
                Double.parseDouble(cursor.getString(4)), // BE intake
                Double.parseDouble(cursor.getString(5)), // glucose
                Double.parseDouble(cursor.getString(6)), // bolus
                Double.parseDouble(cursor.getString(7)) // basal

        );
        // return m
        return m;
    }
}

我希望你能帮助我。在此先感谢大家。

【问题讨论】:

  • 如果您的数据库中有数据并且游标总是返回 0 行,那么您的 KEY_DATE + "=?" 过滤器可能没有按照您的预期进行。

标签: java android mysql database cursor


【解决方案1】:

我可能遗漏了一些东西,但该代码对我来说看起来是正确的。您确定您要查找的数据实际上在数据库中,并且您传递给 getLastMeasure() 的参数是正确的吗?

【讨论】:

    【解决方案2】:

    您的查询似乎没有返回与您的搜索匹配的数据。如果您只想按日期获取最新数据,我建议order by KEY_DATE desclimit 1,或max(KEY_DATE) 而不是KEY_DATE + "=?"

    旁注:无需检查cursor 是否为nullSQLiteDatabase#query 永远不会返回空值Cursor),无论如何您的检查是无用的,因为您正在访问cursor,即使它是@987654331 @。你也没有关闭Cursor

    【讨论】:

    • 顺便说一句,max()方法不存在
    • 从方法返回前关闭光标。这就是为什么我也更喜欢在这种方法中只有一个回报。您可以修改代码以仅使用一个 return 语句具有完全相同的行为(通常也只有一个 return 语句使该方法更具可读性,因为退出点只有一个)。我的意思是SQLite max() function
    • 我该如何调用该函数?我关闭了光标,但它仍然不起作用。
    • 关闭光标并不能解决您当前的问题。这是为了避免内存泄漏。不知道你能不能用max()那个查询方法,你可以先试试我建议的其他方案。
    猜你喜欢
    • 2023-03-10
    • 2014-01-09
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    相关资源
    最近更新 更多