Flutterのファイル操作とローカルDB活用術!初心者でもできるデータ保存の基本
生徒
「Flutterでデータを保存する方法ってありますか?アプリを再起動しても残っててほしくて…」
先生
「ありますよ!Flutterではファイルに保存する方法や、ローカルデータベース(sqfliteやdrift)を使って管理する方法があります。」
生徒
「どれを使えばいいのか悩んでしまって…どんな時にどれを使うんですか?」
先生
「それではFlutterのファイル操作とローカルDBの基本を、初心者向けに順を追って解説していきましょう!」
1. Flutterでファイルを扱う基本(ファイル操作)
Flutterアプリでユーザーの設定情報や一時データを保存したいとき、まず試してみたいのが「ファイル保存」です。path_providerパッケージを使えば、簡単にアプリのドキュメントディレクトリへアクセスできます。
まずはpubspec.yamlに次の依存関係を追加しましょう。
dependencies:
flutter:
sdk: flutter
path_provider: ^2.0.15
dart: ^3.0.0
次に、ファイルの読み書きサンプルを見てみましょう。
import 'dart:io';
import 'package:path_provider/path_provider.dart';
Future<String> get _localPath async {
final directory = await getApplicationDocumentsDirectory();
return directory.path;
}
Future<File> get _localFile async {
final path = await _localPath;
return File('$path/data.txt');
}
Future<String> readData() async {
try {
final file = await _localFile;
return await file.readAsString();
} catch (e) {
return '';
}
}
Future<File> writeData(String data) async {
final file = await _localFile;
return file.writeAsString(data);
}
このコードでFlutterアプリ内にテキストファイルを保存し、後から読み出すことができます。設定の保存やログイン状態の保持など、ちょっとしたデータ保存に便利です。
2. Flutterでローカルデータベースを使う方法(sqflite)
sqflite(スクフライト)は、Flutterで最もよく使われるSQLiteのラッパーパッケージです。リレーショナルデータベースを扱えるので、複雑なデータ管理に向いています。
まずは依存関係を追加しましょう。
dependencies:
sqflite: ^2.2.8+4
path: ^1.8.0
次に、基本的な使い方のサンプルです。
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
Future<Database> initDatabase() async {
return openDatabase(
join(await getDatabasesPath(), 'user_database.db'),
onCreate: (db, version) {
return db.execute(
'CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT)',
);
},
version: 1,
);
}
Future<void> insertUser(Database db, int id, String name) async {
await db.insert(
'users',
{'id': id, 'name': name},
conflictAlgorithm: ConflictAlgorithm.replace,
);
}
Future<List<Map<String, dynamic>>> getUsers(Database db) async {
return db.query('users');
}
データの追加・取得・更新・削除など、基本的なCRUD操作がこのようにできます。フォーム入力やユーザー一覧の保存にぴったりです。
3. FlutterでDrift(旧moor)を使って宣言的にDB管理
Drift(ドリフト)は、SQL文を書かずにDartコードでデータベース操作ができる便利なパッケージです。型安全で保守性が高く、ビルド時にコード生成されるため、エラーの少ない開発が可能になります。
依存関係は以下のように設定します。
dependencies:
drift: ^2.14.0
sqlite3_flutter_libs: any
path_provider: ^2.0.15
dev_dependencies:
drift_dev: ^2.14.0
build_runner: ^2.4.6
簡単なテーブル定義とアクセス例です。
import 'package:drift/drift.dart';
import 'package:drift/native.dart';
import 'dart:io';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;
part 'app_database.g.dart';
class Tasks extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get title => text()();
}
@DriftDatabase(tables: [Tasks])
class AppDatabase extends _$AppDatabase {
AppDatabase() : super(_openConnection());
@override
int get schemaVersion => 1;
}
LazyDatabase _openConnection() {
return LazyDatabase(() async {
final dir = await getApplicationDocumentsDirectory();
final file = File(p.join(dir.path, 'db.sqlite'));
return NativeDatabase(file);
});
}
build_runnerで自動生成を行うことで、テーブルやクエリを型安全に扱えるのがDriftの魅力です。
Flutterを「実務レベル」で使えるようになりたい人や、 iPhone / Android両対応アプリ開発の流れをまとめて学びたい人には、 定番の実践書がこちらです。
Flutter実践開発をAmazonで見る※ Amazon広告リンク
4. ファイル保存とローカルDBの選び方
Flutterでデータを保存する際、用途によって使い分けが重要です。
- ファイル保存:設定情報や単純な文字列、一時的なキャッシュなど。
- sqflite:中〜大規模なデータ。ログイン情報・ユーザーリスト・履歴など。
- drift:複雑なデータ構造・型安全を求める場合に便利。拡張性の高い開発向き。
初心者はまずファイル保存から始め、慣れてきたらsqfliteを導入、さらに効率を求めるならdriftという順番で学ぶのがおすすめです。
5. Flutterのファイル保存やDBを学ぶときの注意点
以下の点にも注意しながら実装してみましょう。
- 非同期処理:ファイル操作やDBアクセスは
async/awaitを活用して実装しましょう。 - エラーハンドリング:ファイルが存在しない・DB接続失敗などを想定した処理も重要です。
- セキュリティ:ユーザーデータを保存する際は、暗号化も検討しましょう。
- iOSとAndroidの違い:path_providerなどは、端末ごとの挙動の違いにも注意が必要です。
Flutterでのデータ保存は、アプリ開発において欠かせない技術です。この記事で紹介したFlutterのファイル操作やローカルDB(sqflite・drift)を活用することで、より便利なアプリを開発できるようになります。