すらぼうの開発ノート

モバイルアプリエンジニアのメモ

【Flutter】sqfliteの使い方

SQLiteとは

オープンソースのデータベース管理システム(RDBMS)。

他のRDBMSと異なるのは、サーバーにインストールして使用するのではなくアプリケーション自体に組み込む点。そのため専用のサーバーを用意することなく利用できる。

モバイルアプリケーションがローカルにデータを保存するために使用されることが多い。

公式サイトは以下。

www.sqlite.org


sqfliteとは

pub.dev

Flutter用SQLiteプラグイン。 多くのエンタープライズアプリケーションでも利用されており、私が勤務している企業がリリースしたスマホアプリでも利用している。

公式リポは以下。

github.com

またgoogleがcookbookページにてsqfliteの使用方法を解説しているので、興味があればそちらもチェックしてほしい。

docs.flutter.dev

shared_preferencesとの違い

念の為「ローカルにデータを保存する」という点で似ているshared_preferencesとの違いを説明する。 それぞれのパッケージを利用すべきケースは以下。

sqfliteを利用すべきケース

  • データ構造が複雑
  • データが大量かつソートや走査などを行う
  • データ間で何かしら相互依存関係がある
  • ユーザー投稿など

shared_preferencesを利用するケース

  • データ構造が単純
  • データ量が少しかつソートや走査などを行わない
  • 設定データなど

使い方

インストール

sqfliteサードパーティのパッケージなのでpubspec.yamlに以下の記述を追記する。 なおバージョンは使用する際に確認すること。

sqflite実装フロー

sqfliteに限らず、データベースを実装する際の大まかな流れは以下。

  1. データベースを開く・テーブルを作成する(既に存在する場合はスキップ)
  2. クエリを発行してデータを操作・取得する
  3. 取得したデータをもとに何かしらの処理を行う
  4. データベースを閉じる(アプリをキルすれば自動的に閉じられるので、明示的に閉じたい場合)

以降では上記の処理を実現するためにsqfliteではどのような記述が必要なのかを説明する。

データベースを開く・テーブルを作成する

データベースを開く

sqfliteでデータベースを開く場合にはopenDatabase()を使用する。

上記コードのデータベースファイル名は、例えば"post.dbのような形式になる。 どのようなデータが格納されているかが分かりやすい名称にすると良い。

テーブルを作成する

またデータベース作成時の処理は、データベースのスキーマを定義する際の処理が指定される。 どのようなデータ構造のテーブルを作成するかを宣言するプロパティである。

具体的な記述は以下のサイトなどを参照して確認してほしい。

www.javadrive.jp

クエリを発行してデータを操作・取得する

sqfliteにおけるクエリについて

sqfliteでは基本的なデータベース操作処理(所謂CRUD)のラッパーメソッドが用意されている。 なのでシンプルな処理においては生のSQLを記述するよりもラッパーメソッドを利用した方が記述が少なくて済む

以下でCRUD処理のラッパーメソッド使用方法について説明する。

CRUD処理

CRUD処理とは

データベースの基本的な操作の頭文字をとったキーワード。

e-words.jp

  • Create: レコードをテーブルに挿入する
  • Read: レコードを読み取る
  • Update: レコードを更新する
  • Delete: レコードを削除する

[Create] レコードを挿入

insert()メソッドでレコードを挿入する。

注意点としては、挿入するレコードMap<String, dynamic>型であること。 なので何かしらのモデルクラスでデータを扱っている場合は、toMap()のようにクラスメンバをMapに変換できるメソッドを用意しておくと良い。

[Read] レコードを読み取る

query()メソッドでレコードを読み取る。

注意点はwhereArgsに渡す値はList型である点。値が一つでもList形式で指定する必要がある。

[Update] レコードを更新する

update()メソッドでレコードを更新する。

[Delete] レコードを削除

delete()メソッドでレコードを削除する。

それぞれの頭文字をまとめると「CRUD」になる。

データベースを閉じる

通常は不要な操作だが、意図してデータベースを閉じる場合は次のように行う。


その他のデータ管理用パッケージ

Flutterではsqflite以外にも以下のパッケージでデータ管理を行うことがある。

  • shared_preferences
  • hive

これらの使用方法は以下のエントリにまとめている。

note-tmk.hatenablog.com

note-tmk.hatenablog.com