首页 > 解决方案 > 如何按整数查询 SQLite?

问题描述

我有一个如下的 SQL 表:

ID(string)    Name(string)    Width(double)   Height(double)   Selected(int)

12345678      Book            210             297              1
12345679      Display         530             326              0
12345680      Phone           70              140              0

我可以通过毫无问题地传递字符串参数来按 ID 和名称查询它们,但是所有 int 和 double 查询都返回 null。为什么?

这是我试过的代码:

Cursor cursor = mDatabase.query(  "Objects",null, "Selected" + " = ?", new String[]{String.valueOf(1)},null,null,null);
ObjectDataBase.ObjectCursor objectCursor = new 
ObjectDataBase.ObjectCursor(cursor);
try {
    if (objectCursor.getCount() == 0) {  return null;  }
    objectCursor.moveToFirst();
    return objectCursor.getObject();
} finally { cursor.close();}

ObjectDataBase是 Database 类,ObjectCursor是游标包装器和ObjectDataBase.

当我使用数据库浏览器查看数据库时,数据是正确的,那么还有什么问题呢?

标签: android-sqlite

解决方案


当我使用数据库浏览器查看数据库时,数据是正确的,那么还有什么问题呢?

a) DB Browser 中的数据可能不是设备上的数据。

  • 这是问题的常见原因。

  • 为了排除这种情况,我建议在没有 select 子句的情况下运行查询,以便返回所有行以及一些基本调试

Cursor cursor = mDatabase.query("Objects",null, "Selected" + " = ?", new String[]{String.valueOf(1)},null,null,null);
Log.d("CURSORINFO","The Cursor has " + String.valueOf(cursor.getCount()) + " rows."); //<<<<<<<<<< 4 DEBUG
DatabaseUtils.dumpCursor(cursor); //<<<<<<<<<< 4 DEBUG

ObjectDataBase.ObjectCursor objectCursor = new 
ObjectDataBase.ObjectCursor(cursor);
try {
    if (objectCursor.getCount() == 0) {  return null;  }
    objectCursor.moveToFirst();
    return objectCursor.getObject();
} finally { cursor.close();}
  • 如果日志中的第一条消息报告有 0 行,则表中没有数据。
  • 如果表中有数据,则dumpCursor方法的输出将输出所有数据。您需要检查它是否与您期望的表格相匹配。

  • 如果数据符合预期,则重新引入 select 子句并重新运行。行数为 0,然后问题出在 select 子句上。

b) 在 try 子句中包装代码

  • 如果存在潜在的异常,这可以隐藏有用的信息。

  • 您的代码会更好:-

    ObjectType rv = null;
    if (objectCursor.moveToFirst()) {
        rv = objectCursor.getObject();
    }
    cursor.close();
    return rv;
    
  • 如果发生异常,那么您将知道它。

c) 游标包装代码错误地赋值。

  • 由于代码不包含在问题中,因此除了检查代码之外,无法说任何其他内容。

推荐阅读