【Flutter】driftでWhere句のlikeとregexpでつまづいた

2023/06/07に公開

まえがき

FlutterでSQLiteを扱うためにパッケージdriftを使用しています。
以前、挫折して再び挑戦していますが、ここまでCRUD機能をマスターしました。
公式ドキュメントや以下のサイトを参考にさせていただきました。

https://blog.flutteruniv.com/flutter-drift/

とくに型の付け方がわからなくて、参考になりました。
DartにしかりTypeScriptにしかり。
いつも型の付け方に戸惑ってしまいますが、少しずつわかってきたような気がします。

今回の問題は・・・

今度は検索機能を実装することになりました。
まずはドキュメントを見ながら、1つの条件での検索機能をすぐにできました。
そして、複数条件での検索機能に取りかかったら、問題発生!!
しかし、どうにか解決(記事ネタが)できたので記録しておきます。
まずは正解から(だと思う

実例

テーブルitemsにはitemNameに商品名が格納されています。
ここでは商品名から「あ行」の商品を検索します。
具体的には「あ」「い」「う」「え」「お」で始まる商品を検索することになります。

方法 1

likeと使って検索条件をひとつづつで繋げる方法があります。

(select(items)
  ..where(
    (tbl) => tbl.itemName.like("あ%") |
             tbl.itemName.like("い%") |
             tbl.itemName.like("う%") |
             tbl.itemName.like("え%") |
             tbl.itemName.like("お%"),
  )).get();

方法 2

regexpを使って検索条件を正規表現で指定する方法があります。

(select(items)
  ..where(
    (tbl) => tbl.itemName.regexp("^(あ|い|う|え|お).+")
  )).get();

実は・・・

私の勘違いからの思い込み遠回りをしてしまいました。
APIドキュメントでlikeを検索してみたら、以下のような結果になりました。

https://drift.simonbinder.eu/api/drift/stringexpressionoperators/like

Expression<bool> like(
  String regex
)

メソッドlikeの引数がregexとなっています。
引数regexを見て「これは正規表現を使える」と私は勘違いします。
ここから、思い込みで迷走が始まって・・・。

で、なぜregexpを見つけたのか?
それは当記事を書くために調べていたら見つけました。
SQLの基本的な部分はどのデータベースでも共通なはずです。
そこでMySQLのサイトを参考にしました。

https://www.javadrive.jp/mysql/#section_select

すると、REGEXPを使う方法が載っていました。
そこからは、とんとん拍子で使い方をマスター!!
お恥ずかしい話で私の勉強不足が露呈してしまいました。

それとregexregexpのように、ドキュメントの中にも勘違いを誘発する引っ掛けがあります。
中途半端に知識があると、とくにひっかかると思います。
これはこれで遺憾とは思うんですが・・・。

まずは、とにかく動くアプリを作る

私はいつも、ついついスマートな書き方を求めてしまいます。
今回の場合は正規表現でスマートな書き方を求めてしまったことです。

しかし、どんなコードであれ、まずは思った通りに動くプログラムを作ること!!
寄り道しそうになると、いつも自分に言い聞かせています。

スマホアプリ「ひとこと投資メモ」シリーズをリリース中

Flutter学習のアウトプットの一環として「日本株ひとこと投資メモ」「米国株ひとこと投資メモ」を公開しています。

簡単に使えるライトな投資メモアプリです。
iPhone、Android両方に対応しています。
みなさんの投資ライフに少しでも活用していただきれば幸いです。
以下のリンクからそれぞれのサイトに移動してダウンロードをお願いします。
https://jpstockminimemo.arafipro.com/
https://usstockminimemo.arafipro.com/

GitHubで編集を提案

Discussion