亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

SQLite rawQuery + String.format = “該語句有 0 個參數。”?

SQLite rawQuery + String.format = “該語句有 0 個參數。”?

一只斗牛犬 2023-06-04 16:59:53
我正在嘗試在 android 中執行 sqlite rawquery。我從我的設備上下載了數據庫,并使用“sqlite 查詢瀏覽器”Windows 程序試錯,直到我得到我想要的。現在的問題是我有我需要的字符串,我似乎無法將參數輸入其中,我懷疑它只是某種字符串轉義缺陷。我要執行的查詢是SELECT lis.name from listItemSuggestion lis LEFT JOIN listItem li ON lis.name = li.name WHERE li.name is NULL AND lis.name LIKE '%a%'其中 '%a%' 中的 a 需要是可變參數。我在代碼中所做的是這樣的:getReadableDatabase().rawQuery(        String.format("SELECT lis.%s from %s lis LEFT JOIN %s li ON lis.%s = li.%s WHERE li.%s is NULL AND lis.%s LIKE '%%?%%';",            ListItemSuggestion.COLUMN_NAME,            ListItemSuggestion.TABLE_NAME,            ListItem.TABLE_NAME,            ListItemSuggestion.COLUMN_NAME,            ListItem.COLUMN_NAME,            ListItem.COLUMN_NAME,            ListItemSuggestion.COLUMN_NAME        ),        new String[]{filter}    );合同類是:import android.provider.BaseColumns;public final class ListItem {private ListItem(){}public static class ListItemEntry implements BaseColumns{    public static final String TABLE_NAME   = "listItem";    public static final String COLUMN_DONE  = "done";    public static final String COLUMN_NAME  = "name";    public static final String COLUMN_COUNT = "count";    public static final String COLUMN_TIMESTAMP = "timestamp";}}import android.provider.BaseColumns;public final class ListItemSuggestion {private ListItemSuggestion(){}public static class ListItemSuggestionEntry implements BaseColumns{    public static final String TABLE_NAME   = "listItemSuggestion";    public static final String COLUMN_NAME  = "name";}}我得到的錯誤是:無法在索引 1 處綁定參數,因為索引超出范圍。該語句有 0 個參數。(這意味著它沒有在查詢中找到“?”,對吧?雖然有一個......,順便說一句,“過濾器”是一個方法參數)順便說一句:該查詢的目的是為輸入提供建議,其中列表項是動態的(= 在列表/表上,它們可以隨時從中刪除),而每個項目也會靜默創建一個建議項(在另一個表中)實際項目被刪除時不會被刪除。where 子句應獲取與當前文本輸入狀態匹配的建議,并排除列表中已存在的項目。
查看完整描述

3 回答

?
牛魔王的故事

TA貢獻1830條經驗 獲得超3個贊

無法在索引 1 處綁定參數,因為索引超出范圍。該語句有 0 個參數。(這意味著它沒有在查詢中找到“?”,對嗎?


不完全是。


雖然有一個......,順便說一句,“過濾器”是一個方法參數)


問題是問號在帶引號的字符串內。這使它成為純文本,而不是參數占位符。這種變化似乎是你要找的:


getReadableDatabase().rawQuery(

        String.format("SELECT lis.%s from %s lis LEFT JOIN %s li ON lis.%s = li.%s WHERE li.%s is NULL AND lis.%s LIKE ?;",

            ListItemSuggestion.COLUMN_NAME,

            ListItemSuggestion.TABLE_NAME,

            ListItem.TABLE_NAME,

            ListItemSuggestion.COLUMN_NAME,

            ListItem.COLUMN_NAME,

            ListItem.COLUMN_NAME,

            ListItemSuggestion.COLUMN_NAME

        ),

        new String[]{ "%" + filter + "%" }

    );


查看完整回答
反對 回復 2023-06-04
?
MYYA

TA貢獻1868條經驗 獲得超4個贊

完全不相關,但如果使用字符串連接,SQL 將更容易閱讀:


getReadableDatabase().rawQuery(

        "SELECT lis." + ListItemSuggestion.COLUMN_NAME +

         " FROM " + ListItemSuggestion.TABLE_NAME + " lis" +

         " LEFT JOIN " + ListItem.TABLE_NAME + " li" +

           " ON li." + ListItem.COLUMN_NAME + " = lis." + ListItemSuggestion.COLUMN_NAME +

        " WHERE li." + ListItem.COLUMN_NAME + " IS NULL" +

          " AND lis." + ListItemSuggestion.COLUMN_NAME + " LIKE ?",

        new String[] { "%" + filter + "%" }

    );

實際上,您只用于li存在性檢查,所以這樣寫:


getReadableDatabase().rawQuery(

        "SELECT " + ListItemSuggestion.COLUMN_NAME +

         " FROM " + ListItemSuggestion.TABLE_NAME +

        " WHERE " + ListItemSuggestion.COLUMN_NAME + " LIKE ?" +

          " AND " + ListItemSuggestion.COLUMN_NAME + " NOT IN (" +

                 " SELECT li." + ListItem.COLUMN_NAME +

                   " FROM " + ListItem.TABLE_NAME + " li )",

        new String[] { "%" + filter + "%" }

    );


查看完整回答
反對 回復 2023-06-04
?
不負相思意

TA貢獻1777條經驗 獲得超10個贊

我不知道你怎么看這個:


'%%?%%'

可以,但是您必須將其更改為串聯'%' || ? || '%':


getReadableDatabase().rawQuery(

        String.format("SELECT lis.%s from %s lis LEFT JOIN %s li ON lis.%s = li.%s WHERE li.%s is NULL AND lis.%s LIKE '%' || ? || '%';",

            ListItemSuggestion.COLUMN_NAME,

            ListItemSuggestion.TABLE_NAME,

            ListItem.TABLE_NAME,

            ListItemSuggestion.COLUMN_NAME,

            ListItem.COLUMN_NAME,

            ListItem.COLUMN_NAME,

            ListItemSuggestion.COLUMN_NAME

        ),

        new String[]{filter}

    );


查看完整回答
反對 回復 2023-06-04
  • 3 回答
  • 0 關注
  • 205 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號