INDEX / JOURNAL / LOG-014
VOL. 2026 · ENGINEERING
SERIES 7 / 8
LOG-014 · LOCAL STORAGE

そのデータはどこに置くのか

PUBLISHED
2026 · 09 · 11
AUTHOR
MIGIWAYA
READ
約 6 分
TAGS
#flutter#dart

§ 01VOLATILE

§ 02CHOOSE

置き場所向くもの向かないもの
設定値、フラグ、小さな文字列件数のあるデータ、秘密
トークン、鍵、セッション大きなデータ、高頻度の読み書き
検索・更新する構造化データ単発の設定値
画像、エクスポート、バイト列条件で絞り込みたいデータ

§ 03PREFS

lib/infrastructure/settings_store.dartDART
final prefs = SharedPreferencesAsync();
 
await prefs.setBool('isDarkMode', true);
await prefs.setString('locale', 'ja');
 
final isDark = await prefs.getBool('isDarkMode') ?? false;

§ 04SECURE

lib/infrastructure/token_store.dartDART
final storage = FlutterSecureStorage();
 
await storage.write(key: 'accessToken', value: token);
final token = await storage.read(key: 'accessToken'); // null になりうる
await storage.delete(key: 'accessToken');

§ 05SQLITE

lib/infrastructure/database.dartDART
final dir = await getApplicationDocumentsDirectory();
final db = await openDatabase(
join(dir.path, 'app.db'),
version: 1,
onCreate: (db, version) async {
await db.execute('''
CREATE TABLE items (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
quantity INTEGER NOT NULL DEFAULT 0
)
''');
},
);
DART
await db.insert('items', item.toJson());
 
final rows = await db.query('items', where: 'quantity > ?', whereArgs: [0]);
final items = rows.map(Item.fromJson).toList();
DART
await db.transaction((txn) async {
await txn.delete('items', where: 'id = ?', whereArgs: [id]);
await txn.insert('history', log.toJson());
});

§ 06MIGRATION

lib/infrastructure/database.dartDART
openDatabase(
path,
version: 2, // 1 から上げる
onCreate: (db, version) async {
// 新規インストール向けの、最新のスキーマ
},
onUpgrade: (db, oldVersion, newVersion) async {
if (oldVersion < 2) {
await db.execute('ALTER TABLE items ADD COLUMN memo TEXT');
}
},
);

§ 07REPOSITORY

lib/domain/item_repository.dartDART
abstract interface class ItemRepository {
Future<List<Item>> findAll();
Future<void> save(Item item);
}
lib/di/repository_providers.dartDART
final itemRepositoryProvider = Provider<ItemRepository>((ref) {
return SqliteItemRepository(ref.watch(databaseProvider));
});

§ 08SUMMARY

脚注 · NOTES
  1. [1]
  2. [2]
同シリーズ · Flutter の基礎を実コードで学ぶ II
§ + RELATED すべて見る →
INQUIRY
CONTACT
LOCATION
STATUS
Active / Open
ESTABLISHED
2024 · 5 · 5
FORM