问题描述
- 用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; }
解决方案
在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注入的影响。
解决方案二:
楼主写错了,你可能没弄明白这个方法中的参数含义;
你可以这样写试试:
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;
解决方案三:
把(出错时)执行前的sql语句打印出来,可能出错了
我也没看到where啊,关闭会提示出错log的,怎么说的
时间: 2024-09-17 05:44:24