1

我在以下代码中遇到了 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 之前将 ID 转换为字符串来确认我是否在做正确的事情,我是否需要在这两个位中编写 c.moveToFirst() ?

提前谢谢了!

4

2 回答 2

1

尝试改变

"(SELECT max(" + AREA_NUMBER + ") FROM " + AREAS_TABLE + ") AS 最大值"

"SELECT max(" + AREA_NUMBER + ") AS max FROM " + AREAS_TABLE

于 2012-09-19T19:44:19.553 回答
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_NUMBERS Max(AREA_NUMBERS)
  • 游标可能是的,但不会是null
  • 在使用之前不要关闭光标

所以你不需要这个:

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

了解如果c以某种方式出现null,您仍然会收到 NullPointerExceptionc.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;
于 2012-09-19T19:53:24.910 回答