Moor는 Flutter 애플리케이션에서 SQLite를 보다 쉽게 사용할 수 있도록 도와주는 강력한 패키지입니다. Moor는 SQL 문법을 사용하여 테이블과 쿼리를 정의할 수 있으며, 코드 생성 기능을 통해 안전하고 간편하게 데이터베이스 작업을 수행할 수 있습니다. 이번 글에서는 Flutter에서 Moor를 사용하는 방법과 이를 구현하는 예제를 자세히 살펴보겠습니다.
1. Moor 패키지 설치
Flutter 애플리케이션에서 Moor를 사용하기 위해 moor, moor_flutter, provider 패키지를 설치합니다. pubspec.yaml 파일에 다음 의존성을 추가합니다.
dependencies:
flutter:
sdk: flutter
moor: ^4.5.0
moor_flutter: ^4.5.0
provider: ^6.0.1
dev_dependencies:
moor_generator: ^4.5.0
build_runner: ^2.1.7
그리고 pub get 명령어를 실행하여 패키지를 설치합니다.
2. 테이블 정의
Moor를 사용하여 데이터베이스 테이블을 정의합니다. 먼저, lib 디렉토리에 moor_database.dart 파일을 생성합니다. 이 파일에 테이블과 데이터베이스를 정의합니다.
import 'package:moor/moor.dart';
import 'package:moor_flutter/moor_flutter.dart';
part 'moor_database.g.dart';
class Items extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get name => text().withLength(min: 1, max: 50)();
}
@UseMoor(tables: [Items])
class AppDatabase extends _$AppDatabase {
AppDatabase()
: super(FlutterQueryExecutor.inDatabaseFolder(
path: 'db.sqlite',
logStatements: true,
));
@override
int get schemaVersion => 1;
Future<List<Item>> getAllItems() => select(items).get();
Stream<List<Item>> watchAllItems() => select(items).watch();
Future<int> insertItem(Item item) => into(items).insert(item);
Future deleteItem(int id) => (delete(items)..where((t) => t.id.equals(id))).go();
}
위 코드는 Items 테이블과 AppDatabase 클래스를 정의합니다. Items 테이블은 id와 name 열을 포함하며, id는 자동 증가합니다. AppDatabase 클래스는 데이터베이스 초기화, 데이터 삽입, 조회, 삭제 메서드를 포함합니다.
3. 코드 생성
Moor는 코드 생성을 통해 테이블과 데이터베이스를 사용할 수 있도록 합니다. 터미널에서 다음 명령어를 실행하여 코드를 생성합니다.
flutter pub run build_runner build
이 명령어는 moor_database.g.dart 파일을 생성합니다. 이 파일에는 AppDatabase 클래스와 관련된 모든 코드가 포함됩니다.
4. 데이터베이스 사용
이제 Flutter 애플리케이션에서 Moor 데이터베이스를 사용해보겠습니다. main.dart 파일을 다음과 같이 수정합니다.
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'moor_database.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Provider(
create: (_) => AppDatabase(),
child: MaterialApp(
home: DatabaseExample(),
),
);
}
}
class DatabaseExample extends StatefulWidget {
@override
_DatabaseExampleState createState() => _DatabaseExampleState();
}
class _DatabaseExampleState extends State<DatabaseExample> {
TextEditingController _controller = TextEditingController();
@override
Widget build(BuildContext context) {
final database = Provider.of<AppDatabase>(context);
return Scaffold(
appBar: AppBar(
title: Text('Moor Example'),
),
body: Column(
children: <Widget>[
TextField(
controller: _controller,
decoration: InputDecoration(labelText: 'Enter item name'),
onSubmitted: (value) {
final item = ItemsCompanion(
name: Value(value),
);
database.insertItem(item);
_controller.clear();
setState(() {});
},
),
Expanded(
child: StreamBuilder(
stream: database.watchAllItems(),
builder: (context, AsyncSnapshot<List<Item>> snapshot) {
final items = snapshot.data ?? [];
return ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(items[index].name),
trailing: IconButton(
icon: Icon(Icons.delete),
onPressed: () {
database.deleteItem(items[index].id);
setState(() {});
},
),
);
},
);
},
),
),
],
),
);
}
}
위 코드는 Moor 데이터베이스를 사용하여 항목을 삽입, 조회, 삭제하는 예제입니다. TextField를 통해 항목 이름을 입력하고, StreamBuilder를 사용하여 실시간으로 항목 리스트를 표시합니다.
5. 데이터 삽입
데이터베이스에 데이터를 삽입하려면 insertItem 메서드를 사용합니다. 위 예제에서는 TextField의 onSubmitted 콜백에서 데이터를 삽입합니다.
StreamBuilder(
stream: database.watchAllItems(),
builder: (context, AsyncSnapshot<List<Item>> snapshot) {
final items = snapshot.data ?? [];
return ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(items[index].name),
trailing: IconButton(
icon: Icon(Icons.delete),
onPressed: () {
database.deleteItem(items[index].id);
setState(() {});
},
),
);
},
);
},
)
6. 데이터 조회
데이터베이스에서 데이터를 조회하려면 watchAllItems 메서드를 사용합니다. 이 메서드는 스트림을 반환하여 실시간으로 데이터 변화를 감지할 수 있습니다.
StreamBuilder(
stream: database.watchAllItems(),
builder: (context, AsyncSnapshot<List<Item>> snapshot) {
final items = snapshot.data ?? [];
return ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(items[index].name),
trailing: IconButton(
icon: Icon(Icons.delete),
onPressed: () {
database.deleteItem(items[index].id);
setState(() {});
},
),
);
},
);
},
)
7. 데이터 삭제
데이터베이스에서 데이터를 삭제하려면 deleteItem 메서드를 사용합니다. 위 예제에서는 ListTile의 IconButton에서 데이터를 삭제합니다.
onPressed: () {
database.deleteItem(items[index].id);
setState(() {});
}
결론
Flutter 애플리케이션에서 Moor를 사용하면 SQLite 데이터베이스를 보다 쉽게 관리할 수 있습니다. 테이블과 데이터베이스를 정의하고, 데이터를 삽입, 조회, 삭제하는 방법을 통해 Moor의 기본 사용법을 익힐 수 있습니다. 이번 글에서 소개한 방법들을 활용하여 Flutter 애플리케이션에서 Moor를 효율적으로 사용해보세요. Moor를 통해 애플리케이션의 기능을 확장하고, 사용자 경험을 향상시킬 수 있습니다.
'Flutter' 카테고리의 다른 글
Flutter의 SharedPreferences 사용법 (0) | 2024.09.08 |
---|---|
Flutter의 Hive 사용법 (32) | 2024.08.07 |
Flutter의 SQLite 사용법 (0) | 2024.08.06 |
Flutter의 로컬 데이터베이스(Local Database) 사용법 (1) | 2024.08.06 |
Flutter의 웹소켓(WebSocket) 사용법 (29) | 2024.08.04 |