[flutter] 플러터 Riverpod를 사용하여 로컬 데이터베이스에 접근하는 방법은 어떻게 되나요?

이번 포스트에서는 플러터의 상태 관리 라이브러리인 Riverpod를 사용하여 로컬 데이터베이스에 접근하는 방법을 알아보겠습니다.

Riverpod란?

Riverpod는 플러터 앱의 상태 관리를 위한 강력한 라이브러리입니다. 이를 통해 앱의 상태를 효율적으로 관리하고 데이터를 공유할 수 있습니다. Riverpod는 의존성 주입(Dependency Injection)과 같은 디자인 패턴을 통해 코드의 가독성과 유지보수성을 개선할 수 있습니다.

로컬 데이터베이스 접근을 위한 패키지

이번 예제에서는 플러터의 로컬 데이터베이스에 접근하기 위해 sqflite 패키지를 사용할 것입니다. sqflite는 SQLite를 플러터 앱에서 사용할 수 있도록 도와주는 유용한 패키지입니다.

먼저, sqflite 패키지를 pubspec.yaml 파일에 추가해야 합니다. 아래와 같이 dependencies 섹션에 추가합니다.

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.0

패키지를 추가한 후에는 flutter pub get 명령을 실행하여 의존성을 가져옵니다.

데이터베이스 생성하기

데이터베이스를 생성하려면 sqflite 패키지의 openDatabase 함수를 사용해야 합니다. 데이터베이스의 경로를 지정하고, 필요한 경우 버전을 지정할 수도 있습니다. 예를 들면 다음과 같습니다.

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

final database = openDatabase(
  join(await getDatabasesPath(), 'my_database.db'),
  onCreate: (db, version) {
    // 데이터베이스가 생성될 때 실행할 작업이 있다면 여기에 추가합니다.
  },
  version: 1,
);

위 코드에서는 my_database.db라는 이름의 데이터베이스 파일을 생성하고, 필요한 경우 onCreate 콜백 함수를 통해 데이터베이스가 생성될 때 실행할 작업을 추가할 수 있습니다.

데이터베이스 사용하기

데이터베이스에 접근하여 데이터를 추가, 수정, 삭제하는 방법을 알아보겠습니다. 데이터베이스에 접근하기 위해서는 database 객체를 통해 작업을 수행해야 합니다.

데이터 추가하기

Future<void> insertData(YourData data) async {
  final db = await database;

  await db.insert(
    'your_table',
    data.toMap(), // 데이터를 Map 형태로 변환하여 전달합니다.
  );
}

위의 코드에서 insertData 함수는 your_table 테이블에 데이터를 추가하는 역할을 합니다. data 객체를 toMap() 메서드를 사용하여 Map 형태로 변환한 후 db.insert를 호출하여 데이터를 추가합니다.

데이터 조회하기

Future<List<YourData>> getData() async {
  final db = await database;

  final List<Map<String, dynamic>> maps = await db.query('your_table');

  return List.generate(maps.length, (i) {
    return YourData.fromMap(maps[i]); // Map 형태의 데이터를 객체로 변환합니다.
  });
}

위의 코드에서 getData 함수는 your_table 테이블의 모든 데이터를 조회하는 역할을 합니다. db.query를 호출하여 조회한 데이터는 List<Map<String, dynamic>> 형태로 반환됩니다. 이를 List<YourData>로 변환하여 반환합니다.

데이터 수정하기

Future<void> updateData(YourData data) async {
  final db = await database;

  await db.update(
    'your_table',
    data.toMap(), // 수정할 데이터를 Map 형태로 변환하여 전달합니다.
    where: 'id = ?',
    whereArgs: [data.id],
  );
}

위의 코드는 your_table 테이블에서 id 필드가 주어진 data 객체의 id와 일치하는 데이터를 수정합니다. db.update 함수를 호출하여 데이터를 수정합니다.

데이터 삭제하기

Future<void> deleteData(int id) async {
  final db = await database;

  await db.delete(
    'your_table',
    where: 'id = ?',
    whereArgs: [id],
  );
}

위의 코드는 your_table 테이블에서 주어진 id와 일치하는 데이터를 삭제합니다. db.delete 함수를 호출하여 데이터를 삭제합니다.

결론

이번 포스트에서는 플러터 Riverpod를 사용하여 로컬 데이터베이스에 접근하는 방법을 알아보았습니다. sqflite 패키지를 통해 로컬 데이터베이스를 생성하고 데이터를 추가, 조회, 수정, 삭제하는 작업을 수행할 수 있습니다. Riverpod를 활용하여 데이터베이스 작업을 좀 더 효율적이고 간편하게 관리할 수 있습니다. 자세한 내용은 Riverpod와 sqflite의 공식 문서를 참고하시기 바랍니다.

이제 여러분은 Riverpod를 활용한 로컬 데이터베이스 접근에 대해 알게 되었습니다. 플러터 앱에서 데이터베이스를 활용하여 좀 더 다양하고 유용한 기능을 구현해보세요!