🌊
備忘録06 Flutter firebase 参照方法 条件編
概要
実務でsqlserverを使ったデータベースの操作をしているが、
flutterのfirebaseへの操作方法とのギャップがすごく、大変だったので
ここに残す
SQLServerとFirebaseとの違い
ちょっと硬めに言うと、
SQLServer はリレーショナルデータベース管理システム(RDBMS)であり、データはテーブルの形式で保存され、SQL(Structured Query Language)を使用してデータの管理やクエリを行う。
Firebase はNoSQLデータベースであり、データはドキュメントやコレクションの形式で保存される。階層構造(ツリー構造)を持ち、リアルタイムデータベースやクラウドファイアストアとして、スキーマレスなデータモデルを提供している。
この構造が違うために、とても苦労した。
例えば、SQLServerではテーブルの結合をすることで参照する方法が楽だったが、
それができないため、すごく処理がめんどくさい...
慣れてないだけかもだけど。
あと、OR句が使えないのもきつかった...
Firebaseの条件
以下のサイトと参照して勉強した。めっちゃ助かった。
この中で直接操作できるものとできないものを記載する。
検索する時
過去に社員検索機能を実装した時、以下の条件で検索できるようにしていた。
・ワード検索(入力した文字列が含まれる社員を検索)
・部署を指定
・並び替え(登録日の昇順/降順)
それぞれこんな感じで設定
Future<List<String>> fetchSearchUsers(
String keyWord, String department, String orderById) async {
// コレクション指定
Query query = FirebaseFirestore.instance.collection('users');
// 部署を指定している場合、条件追加
if (department != '') {
query = query.where('department', isEqualTo: department);
}
// 昇順/降順が指定している場合、条件追加(降順がデフォルト)
if (orderById == "up") {
query = query.orderBy('createDate', descending: false);
} else {
query = query.orderBy('createDate', descending: true);
}
// 条件を絞ったデータの取得
QuerySnapshot querySnapshot = await query.get();
List<String> userNameList = [];
for (var document in querySnapshot.docs) {
// keyWordが空もしくは'userName'にkeyWordが含まれている場合、listに格納
if (keyWord == "" || document['userName'].contains(keyWord)) {
userNameList.add(document['userName']); // 'userName' の値を抽出
}
}
return userNameList;
}
最後に
このやり方で何とかいけているが、性能があまり良くない...
これをどうにか打破しなくては。
Discussion