2 momo1199 Momo1199 于 2012.12.06 10:48 提问

用where条件查询SQLite数据库

在数据库中用string作为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;
}

3个回答

ce_la_vie
ce_la_vie   2012.12.06 11:14
已采纳

在SQL中要把字符安用括号括起来的。像这样:

//                                                         添加这个 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);

这个方法可以保护你不受SQL注入的影响。

Momo1199
Momo1199 谢谢
5 年多之前 回复
SunBo_Java
SunBo_Java   2012.12.06 11:21

楼主写错了,你可能没弄明白这个方法中的参数含义;

你可以这样写试试:

String[] columns = { KEY_NAME, KEY_NUMBER, KEY_STATUS };
String selection = KEY_STATUS + "=?";
String[] selectionArgs = { "available" };
String orderBy = KEY_NAME + " DESC"; // OR ASC
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, selection, selectionArgs, null, null, orderBy);

这样才能查到数据;
解释一下,query方法在执行中,会被Android自动解析为一条标准的SQL,即:

SELECT
KEY_NAME, KEY_NUMBER, KEY_STATUS
FROM
DATABASE_TABLE
WHERE KEY_STATUS = 'available'
ORDER BY KEY_NAME DESC;
Momo1199
Momo1199 谢谢,学习了
5 年多之前 回复
franzhong
franzhong   2012.12.06 11:02

把(出错时)执行前的sql语句打印出来,可能出错了
我也没看到where啊,关闭会提示出错log的,怎么说的

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!