0

为什么当我在数据库中使用字符串作为 where 条件时,我的程序只是强制关闭。虽然如果我使用数字作为查询条件它工作正常。请帮助我,谢谢

public ArrayList<Contact> getAvailableList() 
{
    // TODO Auto-generated method stub
    ArrayList<Contact> results = new ArrayList<Contact>();
    String[] columns = new String[]{KEY_NAME, KEY_NUMBER, KEY_STATUS};
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_STATUS +"=available" , null, null, null, KEY_NAME);
    String sName = "";
    String sNum = "";
    String status = "";
    int iName = c.getColumnIndex(KEY_NAME);
    int iNumber = c.getColumnIndex(KEY_NUMBER);
    int iStatus = c.getColumnIndex(KEY_STATUS);
    Contact contact;
    for(c.moveToFirst(); ! c.isAfterLast(); c.moveToNext())
    {
        contact = new Contact();
        sName += c.getString(iName);
        sNum += c.getString(iNumber);
        status += c.getString(iStatus);
        contact.setName(sName);
        //contact.setPhoneNumber(sNum);
        contact.setPhoneNumber("0".concat(sNum));
        contact.setStatus(status);
        results.add(contact);
        sName = "";
        sNum = "";
        status = "";
    }
    return results;
}
4

2 回答 2

2

您需要用引号将 SQL 中的字符串包装起来,如下所示:

//                                                       Add these  v         v
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_STATUS +"='available'", 
        null, null, null, KEY_NAME);

或者如果你想使用动态数据,你应该使用selectionArgs参数:

String status = "available";
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_STATUS +"=?", 
        new String[] {status}, null, null, KEY_NAME);

这种方法简化了跟踪复杂 Java/SQL 字符串中匹配引号的过程,更重要的是它可以保护您免受 SQL 注入。

于 2012-12-06T01:45:07.590 回答
1

你忘记' 'available

  Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_STATUS +"='available'" , null, null, null, KEY_NAME);
于 2012-12-06T01:46:03.443 回答