2015-07-10 46 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子句的單個用例外 - 請參閱源代碼以供參考)。

相關問題