【问题标题】:Android: Cursor is always returning null even if the database is not emptyAndroid:即使数据库不为空,光标也总是返回 null
【发布时间】:2022-01-29 01:16:49
【问题描述】:

即使数据库不为空,Cursor 也总是返回 null。为什么?以及如何解决?谢谢。

 public StatParcours getOneUserInfo(int id) {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.query(TABLE_USER, new String[] { KEY_USER_ID,
            KEY_STUDN , KEY_STUDBD, KEY_TEACHN, KEY_TEACHBD}, KEY_USER_ID + "=?",
            new String[] { String.valueOf(id) }, null, null, null, null);

    StatParcours stat = null;
    if ((cursor!= null)&&(cursor.moveToFirst())){      
        stat = new StatParcours(
            Integer.parseInt(cursor.getString(0)),
            cursor.getString(1), 
            cursor.getString(2),
            cursor.getString(3),
            cursor.getString(4));
    }  
    return stat ;
}      

【问题讨论】:

  • 您确定光标为空吗?也许它只是没有任何行?您是否检查过您所做的查询是否会返回至少 1 个结果?
  • 是的,我已经使用 Log 检查了数据库内容,而不是当我调用此方法时显示的 Stat 值,witch 始终为空。所以明白光标总是空的。
  • 如果你这样做 Log.d("Foo", "Cursor is:" + cursor); 会打印 Cursor is: null 吗?如果不打印null,则光标为空。空表示您的查询找到了 0 个符合条件的元素,您可能需要检查您的查询是否有误。
  • 其打印:光标为:android.database.sqlite.SQLiteCursor@428085b0
  • 所以你的光标不是空的,它是空的。这意味着您的数据库中没有任何内容与KEY_USER_ID + "=?" 匹配。检查id 的值,您应该会看到没有与该值完全相同的内容。

标签: java android sqlite android-cursor


【解决方案1】:

您正在将用户 ID 与字符串值进行比较,如果您的用户 ID 是数字,则永远不会成功。

在 Android 中,您应该只对字符串值使用查询参数;您应该将整数直接嵌入到查询字符串中:

cursor = db.query(..., ..., KEY_USER_ID + "=" + id, null, ...);

【讨论】:

    【解决方案2】:

    你应该输入 cursor 是否为空,如果不是,你需要确认 cursor.getCount() 不为零,你确定吗?

    if (cursor!= null && cursor.getCount() > 0 && cursor.moveToFirst()){
        //do something
    }
    

    如果 cursor 为 null 或 cursor.getCount() 为零,但数据库存在且数据正确,则应检测您的 sql 并在终端或 sql 客户端运行命令来解决此问题。

    【讨论】:

    • 检查null 是不必要的,getCountmoveToFirst 检查是多余的。
    • 人们一直说检查 cursor==null 是没有必要的,原因是 cursor is null 的情况,query 会抛出异常,所以你不会去检查。
    【解决方案3】:

    如果您没有特定要求,则创建数据库时的 CursorFactory 值应为空。

    我就是这样解决这个问题的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 2022-06-28
      相关资源
      最近更新 更多