Flutter SQLite

Flutter SQLite 사용법

Flutter에서 SQLite를 사용하면 로컬 데이터베이스에 데이터를 저장하고 관리할 수 있습니다. SQLite는 가벼운 관계형 데이터베이스로, 모바일 애플리케이션에서 널리 사용됩니다. Flutter에서 SQLite를 사용하기 위해서는 sqflite 패키지를 사용합니다. 이 패키지를 사용하여 데이터베이스를 생성, 읽기, 쓰기, 삭제할 수 있습니다.

1. sqflite 패키지 설치

먼저, pubspec.yaml 파일에 sqflitepath 패키지를 추가합니다.

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'),
            ),
          ],
        );
      },
    );
  }
}

요약

  1. 패키지 설치: sqflitepath 패키지를 설치합니다.
  2. 데이터베이스 설정: DatabaseHelper 클래스를 만들어 데이터베이스를 초기화하고 테이블을 생성합니다.
  3. CRUD 작업: 데이터 추가, 읽기, 업데이트, 삭제 작업을 구현합니다.
  4. UI와 통합: Flutter UI와 SQLite 데이터베이스를 통합하여 데이터를 표시하고 조작합니다.

이 예제는 SQLite 데이터베이스를 사용하여 로컬 데이터를 저장하고 관리하는 방법을 보여줍니다. 실제 애플리케이션에서는 이 기본적인 구조를 바탕으로 더 복잡한 데이터 모델과 기능을 추가할 수 있습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *