Search

SQLite

SQLite

ํŒŒ์ผ ๊ธฐ๋ฐ˜์˜ ๋‚ด์žฅํ˜•(Embedded) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ณ , ๋‹จ์ผ ํŒŒ์ผ(.db)๋กœ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ๋ชจ๋ฐ”์ผ, ๋ฐ์Šคํฌํ†ฑ, ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ ๋“ฑ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
โ€ข
SQLite ํŠน์ง•
โ€ข
SQLite๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ณณ
โ€ข
SQLite ๊ธฐ๋ณธ ๋ช…๋ น์–ด
โ€ข
SQLite์™€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋น„๊ต
โ€ข
SQLite์˜ ์žฅ๋‹จ์ 
โ€ข
SQLite๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
โ€ข
SQLite ๋ฐ์ดํ„ฐ ํƒ€์ž…
โ€ข
์˜ˆ์‹œ ์ฝ”๋“œ

1. SQLite์˜ ํŠน์ง•

ํŒŒ์ผ ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

โ€ข
MySQL, PostgreSQL ๊ฐ™์€ ๋‹ค๋ฅธ RDBMS์™€ ๋‹ฌ๋ฆฌ ๋ณ„๋„์˜ ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Œ
โ€ข
๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ํ•˜๋‚˜์˜ .db ํŒŒ์ผ์— ์ €์žฅ๋จ

๊ฐ€๋ณ๊ณ  ๋น ๋ฆ„

โ€ข
๋‹จ์ผ ํŒŒ์ผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ๊ด€๋ฆฌ๊ฐ€ ๊ฐ„ํŽธ
โ€ข
์ž‘์€ ํฌ๊ธฐ์˜ ์ฝ”๋“œ(์•ฝ 600KB)
โ€ข
์ฝ๊ธฐ ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ , ํŠธ๋žœ์žญ์…˜์„ ์ง€์›

ACID(์›์ž์„ฑ, ์ผ๊ด€์„ฑ, ๋…๋ฆฝ์„ฑ, ์ง€์†์„ฑ) ์ง€์›

โ€ข
SQLite๋Š” ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•จ

ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์ง€์›

โ€ข
Windows, macOS, Linux, Android, iOS ๋“ฑ ๋‹ค์–‘ํ•œ ์šด์˜์ฒด์ œ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

์˜คํ”ˆ ์†Œ์Šค ๋ฐ ๋ฌด๋ฃŒ

โ€ข
๋ˆ„๊ตฌ๋‚˜ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ (๊ณต๊ฐœ ๋ผ์ด์„ ์Šค)

2. SQLite๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ณณ

โ€ข
๋ชจ๋ฐ”์ผ ์•ฑ (Android, iOS) โ†’ ์˜ˆ: Flutter, React Native, Swift, Kotlin
โ€ข
์›น ๋ธŒ๋ผ์šฐ์ € โ†’ ์˜ˆ: Google Chrome, Firefox์˜ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ์ €์žฅ
โ€ข
๋ฐ์Šคํฌํ†ฑ ํ”„๋กœ๊ทธ๋žจ โ†’ ์˜ˆ: Windows์˜ ์ผ๋ถ€ ์„ค์ • ์ €์žฅ, macOS์˜ ํŒŒ์ผ ์ธ๋ฑ์‹ฑ
โ€ข
IoT ๋ฐ ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ โ†’ ์˜ˆ: ์ž๋™์ฐจ ๋‚ด๋น„๊ฒŒ์ด์…˜, ์Šค๋งˆํŠธ TV ๋“ฑ

3. SQLite ๊ธฐ๋ณธ ๋ช…๋ น์–ด

SQLite๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” SQL ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ

sqlite3 my_database.db;
SQL
๋ณต์‚ฌ

ํ…Œ์ด๋ธ” ์ƒ์„ฑ

CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER NOT NULL );
SQL
๋ณต์‚ฌ

๋ฐ์ดํ„ฐ ์‚ฝ์ž…

INSERT INTO users (name, age) VALUES ('ํ™๊ธธ๋™', 25);
SQL
๋ณต์‚ฌ

๋ฐ์ดํ„ฐ ์กฐํšŒ

SELECT * FROM users;
SQL
๋ณต์‚ฌ

๋ฐ์ดํ„ฐ ์ˆ˜์ •

UPDATE users SET age = 26 WHERE id = 1;
SQL
๋ณต์‚ฌ

๋ฐ์ดํ„ฐ ์‚ญ์ œ

DELETE FROM users WHERE id = 1;
SQL
๋ณต์‚ฌ

ํ…Œ์ด๋ธ” ์‚ญ์ œ

DROP TABLE users;
SQL
๋ณต์‚ฌ

4. SQLite์™€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋น„๊ต

ํŠน์ง•
SQLite
MySQL
PostgreSQL
์„ค์น˜ ๋ฐฉ์‹
๋‚ด์žฅํ˜• (ํŒŒ์ผ ๊ธฐ๋ฐ˜)
์„œ๋ฒ„ ๊ธฐ๋ฐ˜
์„œ๋ฒ„ ๊ธฐ๋ฐ˜
ํŒŒ์ผ ํฌ๊ธฐ
๋งค์šฐ ์ž‘์Œ (600KB)
๋น„๊ต์  ํผ
ํผ
ํŠธ๋žœ์žญ์…˜
์ง€์›
์ง€์›
๊ฐ•๋ ฅํ•œ ์ง€์›
์†๋„
๋น ๋ฆ„ (๊ฒฝ๋Ÿ‰ํ™”)
๋น ๋ฆ„
๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ์— ์ตœ์ ํ™”
์‚ฌ์šฉ์ฒ˜
๋ชจ๋ฐ”์ผ, IoT, ์†Œํ˜• ์•ฑ
์›น, ์ค‘์†Œ ๊ทœ๋ชจ ์„œ๋น„์Šค
๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
SQLite๋Š” ์„œ๋ฒ„๊ฐ€ ํ•„์š” ์—†๋Š” ๊ฐ€๋ฒผ์šด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๋ฏ€๋กœ, ๋ชจ๋ฐ”์ผ ์•ฑ์ด๋‚˜ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, MySQL์ด๋‚˜ PostgreSQL์€ ๋Œ€๊ทœ๋ชจ ์›น ์„œ๋น„์Šค๋‚˜ ๋น…๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

5. SQLite๋ฅผ Flutter์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

Flutter์—์„œ๋Š” sqflite ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SQLite๋ฅผ ์‰ฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ์„ค์น˜ (pubspec.yaml)

dependencies: sqflite: ^2.3.2 path_provider: ^2.1.2
YAML
๋ณต์‚ฌ

SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ

import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; Future<Database> openDB() async { final dbPath = await getDatabasesPath(); final path = join(dbPath, 'my_database.db'); return await openDatabase( path, version: 1, onCreate: (db, version) async { await db.execute(''' CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER NOT NULL ) '''); }, ); }
Dart
๋ณต์‚ฌ

๋ฐ์ดํ„ฐ ์‚ฝ์ž…

Future<void> insertUser(String name, int age) async { final db = await openDB(); await db.insert('users', {'name': name, 'age': age}); }
Dart
๋ณต์‚ฌ

๋ฐ์ดํ„ฐ ์กฐํšŒ

Future<List<Map<String, dynamic>>> getUsers() async { final db = await openDB(); return await db.query('users'); }
Dart
๋ณต์‚ฌ

6. SQLite์˜ ์žฅ๋‹จ์ 

์žฅ์ 
๋‹จ์ 
โ€ข ์„œ๋ฒ„ ์—†์ด๋„ ๋™์ž‘ (์„ค์น˜ ํ•„์š” ์—†์Œ) โ€ข ๋น ๋ฅด๊ณ  ๊ฐ€๋ฒผ์›€ (๋‹จ์ผ ํŒŒ์ผ ๊ด€๋ฆฌ) โ€ข ๋ชจ๋ฐ”์ผ ๋ฐ ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ์—์„œ ์ตœ์ ํ™”๋จ โ€ข ์˜คํ”ˆ์†Œ์Šค์ด๋ฏ€๋กœ ๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
โ€ข ๋™์‹œ ์ ‘์†์ด ๋งŽ์€ ํ™˜๊ฒฝ(์›น ์„œ๋ฒ„)์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Œ โ€ข ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™” ๊ธฐ๋Šฅ์ด ๊ธฐ๋ณธ ์ œ๊ณต๋˜์ง€ ์•Š์Œ โ€ข ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋‚˜ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ํ•œ๊ณ„๊ฐ€ ์žˆ์Œ

7. SQLite๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

SQLite ์‚ฌ์šฉ์ด ์ ํ•ฉํ•œ ๊ฒฝ์šฐ
๋‹ค๋ฅธ DB๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
โ€ข ๋ชจ๋ฐ”์ผ ์•ฑ ๊ฐœ๋ฐœ (Android, iOS) โ€ข ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ ๋ฐ IoT ๊ธฐ๊ธฐ โ€ข ๋ฐ์Šคํฌํ†ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ โ€ข ์ž‘์€ ๊ทœ๋ชจ์˜ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค โ€ข ์˜คํ”„๋ผ์ธ ๋ฐ์ดํ„ฐ ์ €์žฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ โ€ข ๋‹จ์ผ ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ
โ€ข ๋Œ€๊ทœ๋ชจ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ โ€ข ๋™์‹œ ์ ‘์†์ž๊ฐ€ ๋งŽ์€ ์„œ๋น„์Šค โ€ข ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํ•„์š” โ€ข ๋ณต์žกํ•œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ชจ๋ธ โ€ข ๊ณ ๊ธ‰ ๋ณด์•ˆ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ โ€ข ๋‹ค์ค‘ ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ
SQLite๋Š” ๋‹จ์ˆœํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์ตœ์ ์˜ ์„ ํƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋ชจ๋ฐ”์ผ ์•ฑ์ด๋‚˜ ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ์—์„œ๋Š” SQLite์˜ ์žฅ์ ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SQLite ๋ฐ์ดํ„ฐ ํƒ€์ž…

๋ฐ์ดํ„ฐ ํƒ€์ž…
์„ค๋ช…
์‹ค์ œ ์ €์žฅ ํ˜•ํƒœ
INTEGER
์ •์ˆ˜๊ฐ’ (1, 2, 3, โ€ฆ)
1, 2, 3, 4, 6, 8 ๋ฐ”์ดํŠธ (๊ฐ’์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ์ž๋™ ๊ฒฐ์ •)
REAL
์‹ค์ˆ˜ (๋ถ€๋™์†Œ์ˆ˜์ )
8๋ฐ”์ดํŠธ IEEE 754 ๋ถ€๋™์†Œ์ˆ˜์ 
TEXT
๋ฌธ์ž์—ด (UTF-8, UTF-16)
์ €์žฅ๋œ ๋ฌธ์ž์—ด ๊ธธ์ด์— ๋”ฐ๋ผ ๊ฐ€๋ณ€์ 
BLOB
๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ (์ด๋ฏธ์ง€, ํŒŒ์ผ ๋“ฑ)
์ž…๋ ฅ๋œ ๊ทธ๋Œ€๋กœ ์ €์žฅ
NULL
NULL ๊ฐ’
NULL
ํƒ€์ž… ๊ณ„์—ด
์„ค๋ช…
์˜ˆ์ œ ๋ฐ์ดํ„ฐ ํƒ€์ž…
INTEGER
์ •์ˆ˜๊ฐ’ ์ €์žฅ
INT, INTEGER, TINYINT, SMALLINT, BIGINT, UNSIGNED BIG INT
REAL
์‹ค์ˆ˜ ์ €์žฅ (๋ถ€๋™์†Œ์ˆ˜์ )
REAL, DOUBLE, DOUBLE PRECISION, FLOAT
TEXT
๋ฌธ์ž์—ด ์ €์žฅ
TEXT, CHAR(n), VARCHAR(n), CLOB
BLOB
๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ
BLOB (๊ทธ๋Œ€๋กœ ์ €์žฅ)
NUMERIC
์ˆซ์ž(์ •์ˆ˜, ์‹ค์ˆ˜, ๋‚ ์งœ ๋“ฑ) ์ €์žฅ
NUMERIC, DECIMAL, BOOLEAN, DATE, DATETIME

์˜ˆ์‹œ ์ฝ”๋“œ

Flutter์—์„œ SQLite๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” sqflite ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. sqflite ํŒจํ‚ค์ง€ ์„ค์น˜

๋จผ์ € pubspec.yaml ํŒŒ์ผ์— sqflite์™€ path_provider ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
dependencies: flutter: sdk: flutter sqflite: ^2.3.2 path_provider: ^2.1.2
YAML
๋ณต์‚ฌ
ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
flutter pub get
Plain Text
๋ณต์‚ฌ

2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™” ๋ฐ ํ…Œ์ด๋ธ” ์ƒ์„ฑ

Flutter์—์„œ SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด getDatabasesPath()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•œ ํ›„, openDatabase()๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; class DatabaseHelper { static final DatabaseHelper instance = DatabaseHelper._init(); static Database? _database; DatabaseHelper._init(); Future<Database> get database async { if (_database != null) return _database!; _database = await _initDB('my_database.db'); return _database!; } Future<Database> _initDB(String fileName) async { final dbPath = await getDatabasesPath(); final path = join(dbPath, fileName); return await openDatabase( path, version: 1, onCreate: _createDB, ); } Future<void> _createDB(Database db, int version) async { await db.execute(''' CREATE TABLE users( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER NOT NULL ) '''); } }
Dart
๋ณต์‚ฌ

3. ๋ฐ์ดํ„ฐ ์‚ฝ์ž…

์‚ฌ์šฉ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Future<int> insertUser(String name, int age) async { final db = await DatabaseHelper.instance.database; return await db.insert( 'users', {'name': name, 'age': age}, conflictAlgorithm: ConflictAlgorithm.replace, ); }
Dart
๋ณต์‚ฌ

4. ๋ฐ์ดํ„ฐ ์กฐํšŒ

ํ…Œ์ด๋ธ”์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.
Future<List<Map<String, dynamic>>> getUsers() async { final db = await DatabaseHelper.instance.database; return await db.query('users'); }
Dart
๋ณต์‚ฌ

5. ๋ฐ์ดํ„ฐ ์ˆ˜์ •

ํŠน์ • ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
Future<int> updateUser(int id, String name, int age) async { final db = await DatabaseHelper.instance.database; return await db.update( 'users', {'name': name, 'age': age}, where: 'id = ?', whereArgs: [id], ); }
Dart
๋ณต์‚ฌ

6. ๋ฐ์ดํ„ฐ ์‚ญ์ œ

ํŠน์ • ์‚ฌ์šฉ์ž๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
Future<int> deleteUser(int id) async { final db = await DatabaseHelper.instance.database; return await db.delete( 'users', where: 'id = ?', whereArgs: [id], ); }
Dart
๋ณต์‚ฌ

7. ์ „์ฒด ์ฝ”๋“œ ์˜ˆ์ œ

SQLite๋ฅผ ํ™œ์šฉํ•œ ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ์ „์ฒด ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
import 'package:flutter/material.dart'; import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( home: HomePage(), ); } } class HomePage extends StatefulWidget { _HomePageState createState() => _HomePageState(); } class _HomePageState extends State<HomePage> { List<Map<String, dynamic>> users = []; void initState() { super.initState(); _loadUsers(); } Future<void> _loadUsers() async { final data = await DatabaseHelper.instance.getUsers(); setState(() { users = data; }); } Future<void> _addUser() async { await DatabaseHelper.instance.insertUser('ํ™๊ธธ๋™', 25); _loadUsers(); } Future<void> _deleteUser(int id) async { await DatabaseHelper.instance.deleteUser(id); _loadUsers(); } Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('SQLite Example')), body: ListView.builder( itemCount: users.length, itemBuilder: (context, index) { return ListTile( title: Text(users[index]['name']), subtitle: Text('Age: ${users[index]['age']}'), trailing: IconButton( icon: Icon(Icons.delete), onPressed: () => _deleteUser(users[index]['id']), ), ); }, ), floatingActionButton: FloatingActionButton( child: Icon(Icons.add), onPressed: _addUser, ), ); } } class DatabaseHelper { static final DatabaseHelper instance = DatabaseHelper._init(); static Database? _database; DatabaseHelper._init(); Future<Database> get database async { if (_database != null) return _database!; _database = await _initDB('my_database.db'); return _database!; } Future<Database> _initDB(String fileName) async { final dbPath = await getDatabasesPath(); final path = join(dbPath, fileName); return await openDatabase( path, version: 1, onCreate: _createDB, ); } Future<void> _createDB(Database db, int version) async { await db.execute(''' CREATE TABLE users( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER NOT NULL ) '''); } Future<int> insertUser(String name, int age) async { final db = await database; return await db.insert( 'users', {'name': name, 'age': age}, conflictAlgorithm: ConflictAlgorithm.replace, ); } Future<List<Map<String, dynamic>>> getUsers() async { final db = await database; return await db.query('users'); } Future<int> deleteUser(int id) async { final db = await database; return await db.delete( 'users', where: 'id = ?', whereArgs: [id], ); } }
Dart
๋ณต์‚ฌ
์ด์ œ ์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด SQLite๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€, ์กฐํšŒ, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋ณต์žกํ•œ ์•ฑ์„ ๋งŒ๋“ค๋ ค๋ฉด FutureBuilder๋ฅผ ํ™œ์šฉํ•˜๊ฑฐ๋‚˜ Provider ๊ฐ™์€ ์ƒํƒœ ๊ด€๋ฆฌ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.