我遇到以下代码中的SELECT语句问题(这是在我的数据库助手类中):
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 :(得分:1)
尝试更改
“(SELECT max(”+ AREA_NUMBER +“)FROM”+ AREAS_TABLE +“)AS max”
到
“SELECT max(”+ AREA_NUMBER +“)AS max FROM”+ AREAS_TABLE
答案 1 :(得分: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
的Cursor。
一对夫妇注意到:
Max()
之类的功能时,您只能获得一行,因此无需询问AREA_NUMBERS
和 Max(AREA_NUMBERS)
null
所以你不需要这个:
if (c != null) {
c.moveToFirst();
}
c.close();
了解如果c
不知何故null
,您仍然会在c.close()
上收到NullPointerException
(可选)您可以删除whereArgs
并使用:
String whereClause = INSPECTION_LINK + " = " + inspectionId;
(仅因为inspectionId
是long
数据类型,您需要一个String来执行注入攻击。)
最后你应该在这里检查一个空的光标:
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;