關於Room資料庫,拼寫模糊查詢語句遇到的問題

街道書記發表於2018-12-14

前言

最近幫公司做了一個工具類的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坑了吧???,文件上沒寫啊(難道寫了,我沒找到?哪位大兄弟找到告知我一聲)。雖然花了點時間,不過過程中還是學到一些東西的哈。這算使用Room中遇到的小坑吧,看了很多部落格都沒有提到這點,所以在此記錄一些,希望能幫到後續使用Room框架的朋友。最後說一句,Stack Overflow真是個好東西,嘻嘻???。

相關文章