2012-09-19 115 views
1

我在与下面的代码SELECT语句(这是我的数据库辅助类)的问题:SELECT语句不返回MAX数

public Cursor selectMaxAreaNumber (long inspectionId) { 
String inspectionIdString = String.valueOf(inspectionId); 
String[] tableColumns = new String[] { 
     AREA_NUMBER, 
     "(SELECT max(" + AREA_NUMBER + ") FROM " + AREAS_TABLE + ") AS max" 
    }; 
String whereClause = INSPECTION_LINK + " = ?"; 
String[] whereArgs = new String[] { 
     inspectionIdString   
    }; 
Cursor c = rmDb.query(AREAS_TABLE, tableColumns, whereClause, whereArgs, 
     null, null, null); 


if (c != null) { 
    c.moveToFirst(); 
} 
c.close(); 
return c; 

}

我再调用这个我的活动如下:

Cursor c = rmDbHelper.selectMaxAreaNumber(inspectionId); 
    startManagingCursor(c); 
    c.moveToFirst(); 
    nextAreaNumber = c.getInt(c.getColumnIndex("max")) + 1; 

它拉从表中的最大数量,所以它似乎是WHERE语句失败。但是,我看不出问题是什么。

作为这个问题的一部分,任何人都可以确认,如果我通过在查询中使用ID转换为字符串做正确的事情,我是否需要在两个位写入c.moveToFirst()?

非常感谢提前!

+0

嵌套的'SELECT'语句之前执行的'WHERE'子句应用。所以它按预期工作,虽然不符合你的意愿:) – zapl

回答

1

试试这个:

public Cursor selectMaxAreaNumber (long inspectionId) { 
    String[] tableColumns = new String[] { 
     "Max(" + AREA_NUMBER + ") AS max" 
    }; 
    String whereClause = INSPECTION_LINK + " = ?"; 
    String[] whereArgs = new String[] { 
     String.valueOf(inspectionId); 
    }; 
    return rmDb.query(AREAS_TABLE, tableColumns, whereClause, whereArgs, 
     null, null, null); 
} 

这将返回游标最大的AREA_NUMBER有适当的inspectionId

一对夫妇的注意事项:

  • 当你使用像Max()的功能,你只能得到一个行作为一个结果,没有必要要求AREA_NUMBERSMax(AREA_NUMBERS)
  • A光标可能是,但它不会是null
  • 在使用之前不要关闭光标

所以你不需要这样的:

if (c != null) { 
    c.moveToFirst(); 
} 
c.close(); 

明白,如果c某种程度上是null,你仍然会收到上一个NullPointerException c.close()


(可选)您可以删除whereArgs和只需使用:

String whereClause = INSPECTION_LINK + " = " + inspectionId; 

(仅因为inspectionIdlong数据类型,您需要一个字符串来执行注入攻击。)


最后,你应该检查这里的空光标:

Cursor c = rmDbHelper.selectMaxAreaNumber(inspectionId); 
startManagingCursor(c); 
if(c.moveToFirst()) 
    nextAreaNumber = c.getInt(c.getColumnIndex("max")) + 1; 
else //empty Cursor, return a default value 
    nextAreaNumber = 0; 
+0

我给了两个勾号,但这个解决方案是完美的。感谢您的额外信息。我已经从数据库帮助程序类中删除了cursor.close()语句,但是我已经假定我应该关闭一次用于其他活动的游标(游标管理非常混乱!!)。干杯山姆。 – Scamparelli

+0

“(游标管理非常混乱!!)”是的,可以。使用'getInt()','getString()'等完成数据读取后,关闭你的Cursor。但是由于你正在使用'startManagingCursor()',这将关闭你的Cursor! – Sam

1

尝试改变

“(SELECT MAX(” + AREA_NUMBER + “)FROM” + AREAS_TABLE + “)作为最大”

“SELECT MAX(” + AREA_NUMBER +“) AS马克斯“+ AREAS_TABLE

+0

啊,只是意识到我不能给两个蜱!我已经把它交给了Sam,因为他的回答非常详细,但是感谢Rainwork的回应。非常感激。 – Scamparelli