SQLiteとは
他のRDBMSと異なるのは、サーバーにインストールして使用するのではなくアプリケーション自体に組み込む点。そのため専用のサーバーを用意することなく利用できる。
モバイルアプリケーションがローカルにデータを保存するために使用されることが多い。
公式サイトは以下。
sqfliteとは
Flutter用SQLiteプラグイン。 多くのエンタープライズアプリケーションでも利用されており、私が勤務している企業がリリースしたスマホアプリでも利用している。
公式リポは以下。
またgoogleがcookbookページにてsqflite
の使用方法を解説しているので、興味があればそちらもチェックしてほしい。
shared_preferencesとの違い
念の為「ローカルにデータを保存する」という点で似ているshared_preferences
との違いを説明する。
それぞれのパッケージを利用すべきケースは以下。
sqfliteを利用すべきケース
- データ構造が複雑
- データが大量かつソートや走査などを行う
- データ間で何かしら相互依存関係がある
- ユーザー投稿など
shared_preferencesを利用するケース
- データ構造が単純
- データ量が少しかつソートや走査などを行わない
- 設定データなど
使い方
インストール
sqflite
はサードパーティのパッケージなのでpubspec.yaml
に以下の記述を追記する。
なおバージョンは使用する際に確認すること。
sqflite実装フロー
sqflite
に限らず、データベースを実装する際の大まかな流れは以下。
- データベースを開く・テーブルを作成する(既に存在する場合はスキップ)
- クエリを発行してデータを操作・取得する
- 取得したデータをもとに何かしらの処理を行う
- データベースを閉じる(アプリをキルすれば自動的に閉じられるので、明示的に閉じたい場合)
以降では上記の処理を実現するためにsqflite
ではどのような記述が必要なのかを説明する。
データベースを開く・テーブルを作成する
データベースを開く
sqflite
でデータベースを開く場合にはopenDatabase()
を使用する。
上記コードのデータベースファイル名
は、例えば"post.db
のような形式になる。
どのようなデータが格納されているかが分かりやすい名称にすると良い。
テーブルを作成する
またデータベース作成時の処理
は、データベースのスキーマを定義する際の処理が指定される。
どのようなデータ構造のテーブルを作成するかを宣言するプロパティである。
具体的な記述は以下のサイトなどを参照して確認してほしい。
クエリを発行してデータを操作・取得する
sqfliteにおけるクエリについて
sqflite
では基本的なデータベース操作処理(所謂CRUD)のラッパーメソッドが用意されている。
なのでシンプルな処理においては生のSQLを記述するよりもラッパーメソッドを利用した方が記述が少なくて済む。
以下でCRUD処理のラッパーメソッド使用方法について説明する。
CRUD処理
CRUD処理とは
データベースの基本的な操作の頭文字をとったキーワード。
- 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
これらの使用方法は以下のエントリにまとめている。