Android SQLite Cursor不是null运算符的奇怪情况

时间:2014-01-26 21:49:01

标签: android sqlite null operators

我只是在编写代码片段,但它的行为很奇怪:

String sql = "SELECT _id,name,enabled FROM Reference";
Cursor c = mDatabase.rawQuery(sql, new String[] {});
if (c != null && c.getCount() > 0) {
    return c;
}
return null;

逐行调试此代码,我注意到c不是null。通常代码返回null。但是游标值不合逻辑,我的意思是选择查询必须返回一些行,但它不会做任何事情。所以我改变了这样的代码:

String sql = "SELECT _id,name,enabled FROM Reference";
Cursor c = mDatabase.rawQuery(sql, new String[] {});
if (c != null) {
    return c;
}
return null;

再次跟踪此代码,此时光标'c'不为null,但片段返回null! 将整个片段更改为此问题,修复了问题:

String sql = "SELECT _id,name,enabled FROM Reference";
Cursor c = mDatabase.rawQuery(sql, new String[] {});
if (c == null || c.getCount()<=0) {
    return null;
}
return c;

在这种情况下,查询返回合理的行数。我只是想知道第一个代码片段有什么问题!是关于使用!= null 还是其他东西?
请注意,在第一种情况下,光标计数不合理且与数据库选择结果不匹配。

2 个答案:

答案 0 :(得分:2)

调试器在退出帧时跳转到方法的最后一行是正常的。所以似乎最后一行被执行了,而实际上它是另一个return实际发生的。如果您不确定,请检查来电者级别的返回值。

另一件事是rawQuery()永远不会为null返回Cursor

答案 1 :(得分:1)

数据库查询不会返回null。相反,你正在接收一个空光标。这是一个完全有效的对象,就像一个空字符串,所以c == null是假的。但它也不包含任何行,因此c.getCount()返回0。