[flutter] 플러터에서 로컬 데이터베이스 처리 방법

플러터(Flutter)는 개발자가 iOS 및 Android 애플리케이션을 개발하기 위해 사용되는 크로스 플랫폼 프레임워크입니다. 로컬 데이터베이스는 플러터 애플리케이션에서 중요한 역할을 수행하는 기능 중 하나입니다. 플러터에서 로컬 데이터베이스를 처리하는 방법에 대해 알아보겠습니다.

1. sqflite 라이브러리 추가하기

로컬 데이터베이스를 처리하기 위해 sqflite 라이브러리를 사용할 것입니다. pubspec.yaml 파일에 다음과 같은 의존성을 추가하세요:

dependencies:
  sqflite: ^2.0.0+3

의존성을 추가한 후 flutter pub get 명령어를 실행하여 라이브러리를 설치합니다.

2. 데이터베이스 생성

플러터에서 데이터베이스를 생성하려면 openDatabase 함수를 사용합니다. 다음은 데이터베이스를 생성하는 예제 코드입니다:

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

Future<Database> getDatabase() async {
  final String databasesPath = await getDatabasesPath();
  final String path = join(databasesPath, 'my_database.db');
  final database = openDatabase(path, version: 1,
      onCreate: (Database db, int version) async {
    await db.execute('CREATE TABLE contacts (id INTEGER PRIMARY KEY, name TEXT, email TEXT)');
  });
  return database;
}

위의 코드에서 getDatabase 함수는 데이터베이스를 가져오는 비동기 함수입니다. 데이터베이스가 없는 경우에는 새로운 데이터베이스를 생성합니다.

3. 데이터 삽입, 조회, 수정, 삭제

데이터베이스를 생성한 후에는 다음과 같이 데이터를 삽입하고 조회하며 수정하고 삭제할 수 있습니다:

Future<void> insertContact(Contact contact) async {
  final Database db = await getDatabase();
  await db.insert(
    'contacts',
    contact.toMap(),
    conflictAlgorithm: ConflictAlgorithm.replace,
  );
}

Future<List<Contact>> getContacts() async {
  final Database db = await getDatabase();
  final List<Map<String, dynamic>> maps = await db.query('contacts');
  return List.generate(maps.length, (i) {
    return Contact(
      id: maps[i]['id'],
      name: maps[i]['name'],
      email: maps[i]['email'],
    );
  });
}

Future<void> updateContact(Contact contact) async {
  final Database db = await getDatabase();
  await db.update(
    'contacts',
    contact.toMap(),
    where: 'id = ?',
    whereArgs: [contact.id],
  );
}

Future<void> deleteContact(int id) async {
  final Database db = await getDatabase();
  await db.delete(
    'contacts',
    where: 'id = ?',
    whereArgs: [id],
  );
}

위의 코드에서 Contact는 데이터의 모델 객체를 나타내며, toMap 메서드는 모델을 데이터베이스 열과 값을 연결하는 맵으로 변환합니다.

4. 데이터베이스 사용 예제

이제 위에서 작성한 데이터베이스 코드를 사용해보겠습니다:

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'My Contacts',
      home: Scaffold(
        appBar: AppBar(title: Text('My Contacts')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: () {
                  insertContact(Contact(
                    name: 'John Doe',
                    email: 'johndoe@example.com',
                  ));
                },
                child: Text('Insert Contact'),
              ),
              ElevatedButton(
                onPressed: () async {
                  List<Contact> contacts = await getContacts();
                  contacts.forEach((contact) {
                    print('Name: ${contact.name}, Email: ${contact.email}');
                  });
                },
                child: Text('Get Contacts'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

위의 예제 코드에서는 MyApp 클래스에서 ElevatedButton 위젯을 사용하여 데이터베이스에 연락처를 삽입하고, 데이터베이스에서 연락처를 가져옵니다.

이제 플러터에서 로컬 데이터베이스 처리하는 방법에 대해 알게 되었습니다. 이를 기반으로 애플리케이션에서 데이터를 영구적으로 저장하고 관리할 수 있습니다.

참고 자료