SELECT语句不返回MAX号

时间:2012-09-19 19:22:36

标签: android select cursor

我遇到以下代码中的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()?

非常感谢提前!

2 个答案:

答案 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;

(仅因为inspectionIdlong数据类型,您需要一个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;