SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Flutterで始めるモバイルアプリ開発

Flutterでデータを端末に保存する方法は?~Key-Valueでの値の保存とファイルへの保存~

Flutterで始めるモバイルアプリ開発 第23回

  • このエントリーをはてなブックマークに追加

 前回までは、サンプルアプリケーションのログイン部分を想定してhttpリクエストについて説明しました。今回は、チャット部分の実装の前にその準備知識として必要になるデータを端末に保存する方法について紹介します。例えば、ログイン機能の場合、毎回アプリを起動する度に最初から入力する必要があり、面倒なため、前回ログインしたアカウント情報を保存しておきたくなるはずです。また、サーバから取得したコンテンツデータなどを端末上に保存してできるだけサーバへのリクエストはさせたくないというケースもあります。このように、スマホアプリではできるだけ前回利用した状態のデータは端末に保存しておきたいと思うはずです。

  • このエントリーをはてなブックマークに追加

データを端末に保存する方法

 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に追加します。

[リスト1]shared_preferencesパッケージの導入(pubspec.yamlの抜粋)
dependencies:
  : (省略)
  shared_preferences: ^2.0.15

shared_preferencesパッケージを使ったデータの読み書き方法

 リスト2がshared_preferencesを利用する際のサンプルコードです。

[リスト2]shared_preferencesの利用例(shared_prefs.dart)
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)のようにします。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
ファイルにデータを保存する方法

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
Flutterで始めるモバイルアプリ開発連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/16668 2022/10/27 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング