Flutter SQLite 사용법
Flutter에서 SQLite를 사용하면 로컬 데이터베이스에 데이터를 저장하고 관리할 수 있습니다. SQLite는 가벼운 관계형 데이터베이스로, 모바일 애플리케이션에서 널리 사용됩니다. Flutter에서 SQLite를 사용하기 위해서는 sqflite
패키지를 사용합니다. 이 패키지를 사용하여 데이터베이스를 생성, 읽기, 쓰기, 삭제할 수 있습니다.
1. sqflite
패키지 설치
먼저, pubspec.yaml
파일에 sqflite
와 path
패키지를 추가합니다.
dependencies:
flutter:
sdk: flutter
sqflite: ^2.0.0+4
path: ^1.8.0
2. 데이터베이스 설정
데이터베이스를 설정하고, 테이블을 생성합니다.
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
class DatabaseHelper {
static final DatabaseHelper _instance = DatabaseHelper._internal();
factory DatabaseHelper() => _instance;
DatabaseHelper._internal();
static Database? _database;
Future<Database> get database async {
if (_database != null) return _database!;
_database = await _initDatabase();
return _database!;
}
Future<Database> _initDatabase() async {
String path = join(await getDatabasesPath(), 'example.db');
return await openDatabase(
path,
version: 1,
onCreate: _onCreate,
);
}
Future _onCreate(Database db, int version) async {
await db.execute('''
CREATE TABLE items (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
quantity INTEGER
)
''');
}
}
3. 데이터 조작 (CRUD)
데이터베이스에 데이터를 추가, 읽기, 업데이트 및 삭제하는 기본 CRUD 작업을 구현합니다.
데이터 추가
Future<void> insertItem(Map<String, dynamic> item) async {
final db = await DatabaseHelper().database;
await db.insert(
'items',
item,
conflictAlgorithm: ConflictAlgorithm.replace,
);
}
데이터 읽기
Future<List<Map<String, dynamic>>> fetchItems() async {
final db = await DatabaseHelper().database;
return await db.query('items');
}
데이터 업데이트
Future<void> updateItem(Map<String, dynamic> item) async {
final db = await DatabaseHelper().database;
await db.update(
'items',
item,
where: 'id = ?',
whereArgs: [item['id']],
);
}
데이터 삭제
Future<void> deleteItem(int id) async {
final db = await DatabaseHelper().database;
await db.delete(
'items',
where: 'id = ?',
whereArgs: [id],
);
}
4. Flutter UI와 통합
SQLite 데이터베이스와 Flutter UI를 통합하여 데이터를 표시하는 예제를 보겠습니다.
import 'package:flutter/material.dart';
import 'database_helper.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
List<Map<String, dynamic>> _items = [];
@override
void initState() {
super.initState();
_refreshItems();
}
Future<void> _refreshItems() async {
final data = await fetchItems();
setState(() {
_items = data;
});
}
Future<void> _addItem(String name, int quantity) async {
await insertItem({'name': name, 'quantity': quantity});
_refreshItems();
}
Future<void> _updateItem(int id, String name, int quantity) async {
await updateItem({'id': id, 'name': name, 'quantity': quantity});
_refreshItems();
}
Future<void> _deleteItem(int id) async {
await deleteItem(id);
_refreshItems();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('SQLite Example'),
),
body: ListView.builder(
itemCount: _items.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(_items[index]['name']),
subtitle: Text('Quantity: ${_items[index]['quantity']}'),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
icon: Icon(Icons.edit),
onPressed: () => _updateItem(
_items[index]['id'],
_items[index]['name'],
_items[index]['quantity'],
),
),
IconButton(
icon: Icon(Icons.delete),
onPressed: () => _deleteItem(_items[index]['id']),
),
],
),
);
},
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: () => _showAddItemDialog(context),
),
);
}
void _showAddItemDialog(BuildContext context) {
final nameController = TextEditingController();
final quantityController = TextEditingController();
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('Add Item'),
content: Column(
children: [
TextField(
controller: nameController,
decoration: InputDecoration(labelText: 'Name'),
),
TextField(
controller: quantityController,
decoration: InputDecoration(labelText: 'Quantity'),
keyboardType: TextInputType.number,
),
],
),
actions: [
ElevatedButton(
onPressed: () {
final name = nameController.text;
final quantity = int.tryParse(quantityController.text) ?? 0;
_addItem(name, quantity);
Navigator.of(context).pop();
},
child: Text('Add'),
),
],
);
},
);
}
}
요약
- 패키지 설치:
sqflite
와path
패키지를 설치합니다. - 데이터베이스 설정:
DatabaseHelper
클래스를 만들어 데이터베이스를 초기화하고 테이블을 생성합니다. - CRUD 작업: 데이터 추가, 읽기, 업데이트, 삭제 작업을 구현합니다.
- UI와 통합: Flutter UI와 SQLite 데이터베이스를 통합하여 데이터를 표시하고 조작합니다.
이 예제는 SQLite 데이터베이스를 사용하여 로컬 데이터를 저장하고 관리하는 방법을 보여줍니다. 실제 애플리케이션에서는 이 기본적인 구조를 바탕으로 더 복잡한 데이터 모델과 기능을 추가할 수 있습니다.