[flutter] 플러터에서의 오프라인 데이터 저장 방법

플러터를 사용하여 앱을 개발하면서 데이터의 오프라인 저장이 필요한 경우가 많습니다. 사용자의 인터넷 연결이 불안정하거나, 서버와의 통신이 불가능한 상황에서도 데이터를 유지하고 싶은 경우가 있을 수 있습니다. 이러한 경우를 위해 플러터에서는 다양한 방법을 제공합니다.

1. SharedPreferences

SharedPreferences는 앱의 설정이나 간단한 데이터를 영구적으로 저장하기 위한 플러터의 패키지입니다. SharedPreferences를 사용하여 데이터를 디스크에 저장하고, 언제든지 접근할 수 있습니다. 예를 들어, 사용자의 로그인 정보나 앱 설정을 저장하는 데 사용할 수 있습니다.

아래는 SharedPreferences를 사용하여 데이터를 저장하고 읽는 간단한 예시 코드입니다.

import 'package:shared_preferences/shared_preferences.dart';

// 데이터 저장
void saveData(String key, String value) async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.setString(key, value);
}

// 데이터 읽기
void readData(String key) async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  String value = prefs.getString(key) ?? '';
  print(value);
}

2. SQLite

SQLite는 오프라인 데이터베이스로서, 구조화된 데이터를 효율적으로 저장하고 관리할 수 있는 플러터의 패키지입니다. SQLite를 사용하여 복잡한 데이터를 영구적으로 저장하고 필요할 때 데이터를 검색하거나 수정할 수 있습니다.

아래는 SQLite를 사용하여 데이터를 저장하고 읽는 예시 코드입니다.

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

final String tableName = 'myTable';

// 데이터베이스 생성 및 테이블 생성
Future<void> createDatabase() async {
  var databasesPath = await getDatabasesPath();
  String path = join(databasesPath, 'myDatabase.db');

  Database database = await openDatabase(
    path,
    version: 1,
    onCreate: (Database db, int version) async {
      await db.execute('CREATE TABLE $tableName (id INTEGER PRIMARY KEY, name TEXT)');
    },
  );
}

// 데이터 저장
Future<void> saveData(String name) async {
  var databasesPath = await getDatabasesPath();
  String path = join(databasesPath, 'myDatabase.db');

  Database database = await openDatabase(path);
  await database.rawInsert('INSERT INTO $tableName (name) VALUES (?)', [name]);
}

// 데이터 읽기
Future<List<Map<String, dynamic>>> readData() async {
  var databasesPath = await getDatabasesPath();
  String path = join(databasesPath, 'myDatabase.db');

  Database database = await openDatabase(path);
  List<Map<String, dynamic>> results = await database.rawQuery('SELECT * FROM $tableName');
  return results;
}

3. 파일 시스템

파일 시스템을 사용하여 데이터를 오프라인으로 저장할 수도 있습니다. 이 방법은 플러터에서 가장 기본적인 방법으로, 텍스트 파일 또는 이진 파일 형태로 데이터를 저장할 수 있습니다.

아래는 파일 시스템을 사용하여 데이터를 저장하고 읽는 예시 코드입니다.

import 'dart:async';
import 'dart:io';

// 데이터 저장
Future<void> saveData(String data) async {
  String path = 'path/to/file.txt';
  
  File file = File(path);
  await file.writeAsString(data);
}

// 데이터 읽기
Future<String> readData() async {
  String path = 'path/to/file.txt';
  
  File file = File(path);
  String data = await file.readAsString();
  return data;
}

결론

위에서 소개한 세 가지 방법을 통해 플러터에서 오프라인 데이터를 저장하는 방법을 알아보았습니다. 각 방법은 데이터의 종류나 저장할 데이터의 크기에 따라 선택할 수 있으며, 앱의 요구사항에 맞게 적합한 방법을 선택하여 사용하면 됩니다.