【Flutter】driftでWhere句のlikeとregexpでつまづいた
まえがき
FlutterでSQLiteを扱うためにパッケージdriftを使用しています。
以前、挫折して再び挑戦していますが、ここまでCRUD機能をマスターしました。
公式ドキュメントや以下のサイトを参考にさせていただきました。
とくに型の付け方がわからなくて、参考になりました。
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
を検索してみたら、以下のような結果になりました。
Expression<bool> like(
String regex
)
メソッドlike
の引数がregex
となっています。
引数regex
を見て「これは正規表現を使える」と私は勘違いします。
ここから、思い込みで迷走が始まって・・・。
で、なぜregexp
を見つけたのか?
それは当記事を書くために調べていたら見つけました。
SQLの基本的な部分はどのデータベースでも共通なはずです。
そこでMySQLのサイトを参考にしました。
すると、REGEXPを使う方法が載っていました。
そこからは、とんとん拍子で使い方をマスター!!
お恥ずかしい話で私の勉強不足が露呈してしまいました。
それとregex
とregexp
のように、ドキュメントの中にも勘違いを誘発する引っ掛けがあります。
中途半端に知識があると、とくにひっかかると思います。
これはこれで遺憾とは思うんですが・・・。
まずは、とにかく動くアプリを作る
私はいつも、ついついスマートな書き方を求めてしまいます。
今回の場合は正規表現でスマートな書き方を求めてしまったことです。
しかし、どんなコードであれ、まずは思った通りに動くプログラムを作ること!!
寄り道しそうになると、いつも自分に言い聞かせています。
スマホアプリ「ひとこと投資メモ」シリーズをリリース中
Flutter学習のアウトプットの一環として「日本株ひとこと投資メモ」「米国株ひとこと投資メモ」を公開しています。
簡単に使えるライトな投資メモアプリです。
iPhone、Android両方に対応しています。
みなさんの投資ライフに少しでも活用していただきれば幸いです。
以下のリンクからそれぞれのサイトに移動してダウンロードをお願いします。
Discussion