關于Room數據庫,拼寫模糊查找的語句遇到問題

前言

最近幫公司做了一個工具類的app,類似于本地字典查詢的那種,所以肯定要涉及到數據保存到本地,就嘗試用了一下Google自己的架構中的數據庫框架Room。配置和使用還是比較簡單,沒用過得可以看官方文檔,上手還是比較容易的。還有這里是Google官方的代碼庫 Android Room with a View
(你已經是一個成熟的程序猿了,梯子需要自己帶了),一步步教你怎么寫,非常清晰,所以具體使用就不多說了。

說正經的

正經的當然就是遇到的坑??!本來一切增刪改查都進行的很順利,然后項目中有一個搜索的功能,既然是搜索當然是模糊查找了啦。例如查找user表中name包含某字符串的所有用戶,一般sql語句是這樣

Select * From tb_user Where Name Like %name%

在Android端里面一般用的數據庫都是注解@query,后面拼上需要查詢的語句,當然每個數據庫框架要求的格式可能不一樣,但是最終編譯成的最終語句肯定是上面那種格式的。然后我就看了下官方文檔上面給出的例子,代碼是這樣的,注意紅框里面的代碼


Google官方代碼.png

一看,不錯,有like語句的例子,但是這個例子不是模糊查找?。∧切邪?,照葫蘆畫瓢吧。假如不是模糊查找,在Room的Dao里面應該這么寫

@Query("SELECT * FROM tb_use WHERE Name LIKE :name")

基本上和那個sql語句差不多,就是name前面多了一個冒號。下面開始我們模糊查詢語句該怎么寫了,我第一想到的就是這么寫

@Query("SELECT * FROM tb_use WHERE Name LIKE '%' + :name" + '%')

這不是拼接兩端語句常用的嘛,就+拼接一下就OK啦。嗯,也沒報錯,心想估計對了,運行一下,搜索測試一下,我擦,沒有效果,這是什么鬼。難道這不是模糊搜索嗎?還是我拼接的不對。

我就嘗試各種拼接啊,轉義啊,想把那個%給它弄進去啊。但是天不遂人愿啊,各種報錯,報紅線,這里不得不說一個Room的一個好處,就是你在寫sql語句的時候它會檢查,格式不對,里面會報紅線。

嘗試了很長時間,還是沒有嘗試對,就開始看Google的文檔啊,沒找到關于模糊查找該怎么寫的,再繼續百度各種博客,看看有沒有同病相憐的猿猿,不但沒找到解決辦法,還看到有幾篇博客說Room可能不支持模糊查找(可能博主也沒試出來)。我擦類,不會真不支持吧,那樣我可能就要換框架了啊。但是,我心想Google不可能犯這么低級的錯誤??!然后我又跑去各大程序猿吹水群詢問各位大佬。

果然,皇天不負有心人,最終經一個群里大佬提醒以及在Stack Overflow上面搜了一下,找到了最終答案,應該是這樣的

@Query("SELECT * FROM tb_use WHERE Name LIKE '%' || :name" || '%')

原來是用雙豎杠去拼接,而不是加號,欲哭無淚啊。然后我就去搜了一下sql語句拼接,找到這樣一段話

在SQL中的SELECT語句中,可使用一個特殊的操作符來拼接兩個列。根據你所使用的DBMS,此操作符可用加號(+)或兩個豎杠(||)表示。在MySQL和MariaDB中,必須使用特殊的函數。
說明:是+還是||?
Access和SQL Server使用+號。DB2、Oracle、PostgreSQL、SQLite和Open Office Base使用||。詳細請參閱具體的DBMS文檔。
看來SQL的知識點也要懂點??!

再來看看Stack Overflow上面大神給的解釋


Stack Overflow上的解釋.jpg

兩種做法,一種就是我上面用雙豎杠拼接的,還有一種就是在傳參的時候,把%%給拼接好,這種方式我也是測試了一下,也是可以的,因為最終都是轉換成sql的標準查詢語句。

結尾

經過一系列努力,還是找到了解決方案,這次應該是Google坑了吧??????,文檔上沒寫?。y道寫了,我沒找到?哪位大兄弟找到告知我一聲)。雖然花了點時間,不過過程中還是學到一些東西的哈。這算使用Room中遇到的小坑吧,看了很多博客都沒有提到這點,所以在此記錄一些,希望能幫到后續使用Room框架的朋友。最后說一句,Stack Overflow真是個好東西,嘻嘻??????。

ps:不想看Room官方的英文文檔的,可以看這位博主寫的系列傳送門。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 關于Mongodb的全面總結 MongoDB的內部構造《MongoDB The Definitive Guide》...
    中v中閱讀 32,012評論 2 89
  • 轉 # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    呂品?閱讀 9,785評論 0 44
  • 我最喜歡的節日是中秋節。中秋節是我國的傳統佳節,與春節、端午、清明并稱為中國漢族的四大傳統節日。它起源于唐朝時期,...
    素民_de15閱讀 297評論 0 0
  • 好雨知時節, 當春乃發生。 隨風潛入夜, 潤物細無聲。杜甫《春夜喜雨》 綿綿春雨過后,萬物復蘇, 樹木發芽長出新綠...
    伊人淡畫閱讀 307評論 5 6
  • 在生活中大家一般都喜歡和那些脾氣溫和,最好是沒有一絲脾氣的人相處,而那些喜歡把憤怒的情緒掛在臉上的人,大家往往對他...
    1918塞納河岸閱讀 872評論 0 1