로컬 데이터베이스는 Flutter 애플리케이션에서 데이터를 영구적으로 저장하는 데 매우 유용한 도구입니다. SQLite는 대부분의 모바일 플랫폼에서 사용되는 경량화된 로컬 데이터베이스 관리 시스템입니다. 이번 글에서는 Flutter 애플리케이션에서 SQLite를 사용하여 로컬 데이터베이스를 구현하는 방법과 이를 구현하는 예제를 자세히 살펴보겠습니다.
1. SQLite 패키지 설치
Flutter 애플리케이션에서 SQLite를 사용하기 위해 sqflite 패키지와 경로 관리를 위한 path 패키지를 설치합니다. pubspec.yaml 파일에 다음 의존성을 추가합니다.
dependencies:
flutter:
sdk: flutter
sqflite: ^2.0.0+3
path: ^1.8.0
그리고 pub get 명령어를 실행하여 패키지를 설치합니다.
2. 데이터베이스 초기화
SQLite 데이터베이스를 초기화하려면 데이터베이스 파일을 생성하고, 필요한 테이블을 생성하는 코드를 작성해야 합니다. 다음은 데이터베이스 초기화 코드를 포함한 예제입니다.
import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: DatabaseExample(),
);
}
}
class DatabaseExample extends StatefulWidget {
@override
_DatabaseExampleState createState() => _DatabaseExampleState();
}
class _DatabaseExampleState extends State<DatabaseExample> {
Database? database;
@override
void initState() {
super.initState();
_initDatabase();
}
Future<void> _initDatabase() async {
// 데이터베이스 경로 설정
String dbPath = await getDatabasesPath();
String path = join(dbPath, 'example.db');
// 데이터베이스 초기화
database = await openDatabase(
path,
version: 1,
onCreate: (db, version) {
return db.execute(
'CREATE TABLE items(id INTEGER PRIMARY KEY, name TEXT)',
);
},
);
}
Future<void> _insertItem(String name) async {
await database?.insert(
'items',
{'name': name},
conflictAlgorithm: ConflictAlgorithm.replace,
);
}
Future<List<Map<String, dynamic>>> _retrieveItems() async {
return await database?.query('items') ?? [];
}
Future<void> _deleteItem(int id) async {
await database?.delete(
'items',
where: 'id = ?',
whereArgs: [id],
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('SQLite Example'),
),
body: Column(
children: <Widget>[
TextField(
onSubmitted: (value) {
_insertItem(value);
setState(() {});
},
decoration: InputDecoration(labelText: 'Enter item name'),
),
Expanded(
child: FutureBuilder(
future: _retrieveItems(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return CircularProgressIndicator();
}
final items = snapshot.data as List<Map<String, dynamic>>;
return ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(items[index]['name']),
trailing: IconButton(
icon: Icon(Icons.delete),
onPressed: () {
_deleteItem(items[index]['id']);
setState(() {});
},
),
);
},
);
},
),
),
],
),
);
}
}
위 코드는 SQLite 데이터베이스를 초기화하고, 데이터를 삽입, 조회, 삭제하는 예제입니다. openDatabase 메서드를 사용하여 데이터베이스를 열고, 테이블을 생성합니다. insert, query, delete 메서드를 사용하여 데이터를 삽입, 조회, 삭제할 수 있습니다.
3. 데이터 삽입
데이터베이스에 데이터를 삽입하려면 insert 메서드를 사용합니다. 위 예제에서는 _insertItem 메서드를 사용하여 데이터베이스에 항목을 삽입합니다.
Future<void> _insertItem(String name) async {
await database?.insert(
'items',
{'name': name},
conflictAlgorithm: ConflictAlgorithm.replace,
);
}
insert 메서드는 테이블 이름과 데이터 맵을 인수로 받아 데이터를 삽입합니다. conflictAlgorithm 인수는 충돌이 발생했을 때의 동작을 지정합니다.
4. 데이터 조회
데이터베이스에서 데이터를 조회하려면 query 메서드를 사용합니다. 위 예제에서는 _retrieveItems 메서드를 사용하여 데이터베이스에서 항목을 조회합니다.
Future<List<Map<String, dynamic>>> _retrieveItems() async {
return await database?.query('items') ?? [];
}
query 메서드는 테이블 이름을 인수로 받아 데이터를 조회합니다. 결과는 맵의 리스트로 반환됩니다.
5. 데이터 삭제
데이터베이스에서 데이터를 삭제하려면 delete 메서드를 사용합니다. 위 예제에서는 _deleteItem 메서드를 사용하여 데이터베이스에서 항목을 삭제합니다.
Future<void> _deleteItem(int id) async {
await database?.delete(
'items',
where: 'id = ?',
whereArgs: [id],
);
}
delete 메서드는 테이블 이름, 조건(where), 조건 인수(whereArgs)를 인수로 받아 데이터를 삭제합니다.
결론
Flutter 애플리케이션에서 로컬 데이터베이스를 사용하면 데이터를 영구적으로 저장하고 관리할 수 있습니다. sqflite 패키지를 사용하여 SQLite 데이터베이스를 초기화하고, 데이터를 삽입, 조회, 삭제하는 방법을 통해 로컬 데이터베이스 기능을 구현할 수 있습니다. 이번 글에서 소개한 방법들을 활용하여 Flutter 애플리케이션에서 로컬 데이터베이스를 효율적으로 사용해보세요. 로컬 데이터베이스를 통해 애플리케이션의 기능을 확장하고, 사용자 경험을 향상시킬 수 있습니다.
'Flutter' 카테고리의 다른 글
Flutter의 Moor 사용법 (1) | 2024.08.07 |
---|---|
Flutter의 SQLite 사용법 (0) | 2024.08.06 |
Flutter의 웹소켓(WebSocket) 사용법 (29) | 2024.08.04 |
Flutter의 소켓 프로그래밍 사용법 (1) | 2024.08.04 |
Flutter의 NFC 통신 사용법 (2) | 2024.08.04 |