2015-07-10 66 views
-3

我在sqlite表tb_expense上使用字符串user_id字段作为主键。我使用Contentvalues这样如何在android sqlite的where子句中使用字符串字段

ContentValues values = new ContentValues(); 

    values.put(KEY_USER_ID, DatabaseUtils.sqlEscapeString(expense.getUser_id())); 

    values.put(KEY_DATE , DatabaseUtils.sqlEscapeString(date)); 

    values.put(KEY_AMOUNT , expense.getAmount()); 

    values.put(KEY_PARTICULARS , DatabaseUtils.sqlEscapeString(expense.getParticulars())); 

    values.put(KEY_PLACE, DatabaseUtils.sqlEscapeString(expense.getPlace())); 

    long expense_id = db.insert(TABLE_EXPENSE , null ,values); 

插入插入到这个表是完美的,我能够用Log.e打印expense_id但问题是,同时从该表中检索;

当我从tbl_expense没有任何条件检索整个数据时,它的工作正常。

String query = "SELECT * FROM "+TABLE_EXPENSE; 

    Cursor c = db.rawQuery(query,null); 

上面的查询工作正常,我能够得到整个数据;

但是,当我尝试检索一个用户在where子句中使用id的费用时,它不检索任何内容。这里是我的代码

String query = "SELECT * FROM "+TABLE_EXPENSE +" WHERE "+ KEY_USER_ID+" = '"+ user.getId() +"'"; 

    Cursor c = db.rawQuery(query,null); 

Log.e打印查询这样

SELECT * FROM tbl_expense WHERE user_id = 'USR107672' 

我想查询是正确的,也USR107672存在于数据库,因为没有在那里条款这条记录越来越。这里有什么错误?

我也使用db.query这样

Cursor c = db.query 

      (

        TABLE_EXPENSE, 

        new String[] { KEY_USER_ID, KEY_PARTICULARS , KEY_AMOUNT , KEY_DATE , KEY_PLACE }, 

        KEY_USER_ID + " = ? " , 

        new String[] { user.getId()}, 

        null, null, null 

      ); 

尝试,但这样也没有工作。

+1

请正确格式化您的问题 –

+0

您得到哪个**错误**?发布你的logcat。 –

+0

没有得到任何错误,但查询返回空记录 – user3339689

回答

0

昨天我遇到了同样的问题。

原因

DatabaseUtils.sqlEscapeString绝对包围单引号的字符串。所以,你的字符串将是'USR107672'而不是USR107672。这些引号是字符串的一部分,然后存储在数据库中。由于您在WHERE子句中查询数据库时没有使用这些引号,因此未找到匹配项。

解决方案1 ​​

该查询将检索所需的条目:覆盖单引号

Cursor c = db.query (TABLE_EXPENSE, 
      new String[] { KEY_USER_ID, KEY_PARTICULARS , KEY_AMOUNT , KEY_DATE , KEY_PLACE }, 
      KEY_USER_ID + " LIKE ? " , 
      new String[] { "'%" + user.getId() + "%'"}, 
      null, null, null); 

%允许零个或多个字符。

由于这可能会导致不需要的匹配,我宁愿提出以下建议。

解决方案2

使用replaceAll方法逃避单引号:

user.replaceAll("'", "''"); 

SQLite FAQ

最后

我不会用DatabaseUtils.sqlEscapeString了。最终调用的方法DatabaseUtils.appendEscapedSQLString被标记为已弃用(除了需要特殊制作的WHERE子句的单个用例外 - 请参阅源代码以供参考)。

相关问题