我有一个如下的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
我可以通过传递没有问题的String参数来按ID和Name查询它们,但是所有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
是数据库类,而ObjectCursor
是光标包装器和ObjectDataBase
的内部类。
当我使用DB浏览器浏览数据库时,数据是正确的,那么还有什么可能是错误的?
答案 0 :(得分:1)
当我使用DB浏览器浏览数据库时,数据是 正确,那么还有什么可能是错误的?
这是问题的常见原因。
要排除这种情况,我建议在不使用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();}
如果表中确实有数据,则 dumpCursor 方法的输出将输出所有数据。您需要检查它是否与您希望表容纳的内容匹配。
如果数据符合期望,则重新引入select子句并重新运行。行计数为0,则选择子句出现问题。
如果存在基础异常,这可以隐藏有用的信息。
您的代码会更好::-
ObjectType rv = null;
if (objectCursor.moveToFirst()) {
rv = objectCursor.getObject();
}
cursor.close();
return rv;
如果发生异常,那么您会知道的。