使用字符串查询sqlite作为where条件

时间:2012-12-06 01:41:22

标签: android

为什么当我在我的数据库中使用字符串作为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;
}

2 个答案:

答案 0 :(得分: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注入。

答案 1 :(得分:1)

您忘记了' '

周围的available
  Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_STATUS +"='available'" , null, null, null, KEY_NAME);