データを端末に保存する方法
Flutterでデータを端末に保存する方法には、大きく分けて以下の3種類があります。
- Key-Valueで値を保存する方法(shared_preferences)
- ファイルに保存する方法
- データベース(SQLite)に保存する方法
必ずしも、用途が厳密に決まっているわけではありませんが、それぞれメリット・デメリットがあります。
例えば、Key-Value形式で保存する方法はもっとも簡単ですが、大きなデータを扱うことや、複数の値から条件に一致するデータを取得するような処理には向いていません。
一方、ファイルの場合にはデータ形式を問いませんが、一般的には画像ファイルや動画ファイルなどを保存しておく場合に利用されます。こちらも同様に検索するような用途には向いていません。
そして、データベース形式の場合には、データを検索する必要がある場合や複数のデータを一括して扱う場合などに向いています。しかし、自由なデータ形式にはあまり向いていません。それぞれ、特徴も扱い方も違うので、目的に沿って使い分けることが必要です。
Key-Valueで値を保存する方法(shared_preferences)
Key-Value形式のデータを扱うのがshared_preferencesパッケージです。shared_preferencesパッケージは、文字や数値のような設定データを扱うことが得意な方法です。また、他のデータ保存方法に比べて手軽に利用できます。
例えば、他のデータ形式ではデータの読み書きをする際に非同期処理になってしまいます。しかし、この方法ではデータを同期的に読み書きできます。ただし、保存できるデータ型も論理値や数値、文字列のような基本的な型に限定され、大きなデータを扱うのは不向きな管理方法です。
また、shared_preferencesという名前はAndroidが提供しているSharedPreferencesに起因していますが、iOSはもちろん、すべてのプラットフォームで利用可能です。
shared_preferencesパッケージの利用方法
shared_preferencesパッケージを利用する場合には、以下のようにpubspec.yamlに追加します。
dependencies: : (省略) shared_preferences: ^2.0.15
shared_preferencesパッケージを使ったデータの読み書き方法
リスト2がshared_preferencesを利用する際のサンプルコードです。
import 'package:shared_preferences/shared_preferences.dart'; Future<void> sharedPrefs() async{ // (1) SharedPreferences のインスタンスを取得 var prefs = await SharedPreferences.getInstance(); // (2) 値の保存 prefs.setBool("enable_save", true); prefs.setString("api_key", "dummy_key"); prefs.setInt("last_at", DateTime.now().microsecondsSinceEpoch); prefs.setDouble("margin", 5.5); prefs.setStringList("keys", ["a","b","c"]); // (3) 値の取得 final bool? enable_save = prefs.getBool("enable_save"); final String? api_key = prefs.getString("api_key"); final int? last_at = prefs.getInt("last_at"); final double? margin = prefs.getDouble("margin"); final List<String>? keys = prefs.getStringList("keys"); // (4) 保存されているKey値の取得 final Set<String> prefKeys = prefs.getKeys(); for(var name in prefKeys){ print("key is ${name}"); } // (5) 値の削除 final ret = await prefs.remove("keys"); // (6) すべての値をクリアする final bool ok = await prefs.clear(); }
(1)でSharedPreferencesクラスのインスタンスを取得します。そして、値を保存する場合には(2)のように値を設定します。set[Type]のように型を示すメソッドを利用し、値を保存します。
また、List<String>型のデータも扱うことが可能であり、これは配列型としてデータを保存しておきたい場合に利用します。そして、値を取得する場合には、(3)のようにget[Type]のようなメソッドで値を取得します。また、保存したKey値の一覧を取得したい場合には(4)のようにgetKeys()メソッドで取得可能です。
ただし、すべてのKey値を取得するので、Key値を検索して利用するような使い方が必要な場合には、データベースを利用する方法を検討してください。また、値を削除する場合には、(5)のようにキー値を指定して削除することができ、すべての値を削除する場合には(6)のようにします。