이 글은 '11가지 앱을 만들며 배우는 크로스 플랫폼 앱개발 플러터 프로젝트' 라는 교재를 바탕으로 쓴 필기노트입니다.
dependencies:
flutter:
sdk: flutter
sqflite: ^2.2.0+2
class DbHelper{
final int version = 1;
Database? db;
}
데이베이스 작업은 실행하는 데 시간이 걸리고, 대량의 데이터를 처리하는 경우가 있으므로 비동기적으로 처리해야 한다.
만약 db 객체가 null이라면 데이터베이스를 열어야 한다.
sqflite 라이브러리에는 openDatabase 메서드가 있는데, 호출할 때 열 데이터베이스의 path, 데이터베이스의 version, onCreate 매개변수에 해당하는 세 가지 매개변수를 설정한다. 여기서 onCreate 매개변수는 지정된 경로의 데이터베이스를 찾을 수 없거나 버전이 다른 경우에만 호출된다.
Future<Database?> openDb() async {
if (db == null) {
db = await openDatabase(join(await getDatabasesPath(), 'shopping.db'),
onCreate: (database, version) {
database.execute('CREATE TABLE lists(id INTEGER PRIMARY KEY, name TEXT, priority INTEGER)');
database.execute('CREATE TABLE items(id INTEGER PRIMARY KEY,' + 'idList INTEGER, name TEXT, quantity TEXT, ' + 'note TEXT, ' + 'FOREIGN KEY(idList) REFERENCES lists(id))');
}, version: version);
}
+) 데이터 타입을 뒤에다가 써주네요 대박
SQLite에서 사용되는 데이터 타입은 NULL, INTEGER, REAL, TEXT, BLOB 입니다.
return db;
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
class DbHelper{
final int version = 1; //데이터 베이스 버전
Database? db; //SQLite 데이터베이스 자체
Future<Database?> openDb() async {
if (db == null) {
db = await openDatabase(join(await getDatabasesPath(), 'shopping.db'),
onCreate: (database, version) {
database.execute(
'CREATE TABLE lists(id INTEGER PRIMARY KEY, name TEXT, priority INTEGER)');
database.execute('CREATE TABLE items(id INTEGER PRIMARY KEY,' +
'idList INTEGER, name TEXT, quantity TEXT, ' + 'note TEXT, ' +
'FOREIGN KEY(idList) REFERENCES lists(id))');
}, version: version);
}
return db;
}
}
데이터베이스가 제대로 생성된건지 확인하기!!!!
아래 코드는 DbHelper 클래스 내부에서 계속 진행한다.
1.
Future testDb() async {
db = await openDb(); //데이터베이스를 환하는 openDb() 메서드 대기
await db?.execute('INSERT INTO lists VALUES (0, "Fruit", 2)'); //lists 테이블에 레코드를 삽입하기 위해 첫 번째로 호출
await db?.execute('INSERT INTO items VALUES (0, 0, "Apples",' + '"2Kg", "Better if they are green")'); // items테이블에 레코드를 삽입하기 위해 두 번째로 호출.
List lists = await db!.rawQuery('select * from lists'); //select 쿼리를 전달하여 데이터베이스의 테이블에서 읽음. 검색된 값을 List로 반환.
//Select * 는 지정된 테이블의 모든 값을 가져온다.
List items = await db!.rawQuery('select * from items');
print(lists[0].toString());
print(items[0].toString());
}
import 'package:flutter/material.dart';
import './util/dbhelper.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
Widget build(BuildContext context) {
DbHelper helper = DbHelper();
helper.testDb();
return MaterialApp(
title: 'Shopping List',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Container());
}
}

중간에 Database db; 선언해줄 때 책대로 했더니 오류가 났다. 플러터에서는 late를 넣으라고 했는데 wow 바로 오류가 났다. 초기값을 넣어주지 않아서 생기는 오류라고 하는데, db는 초기값을 따로 설정해주는.. 건 아닌 것 같아서 ? 를 넣었다. 구글링 최고다~~~
오류 고칠 때 내가 참고한 사이트
https://www.fluttercampus.com/guide/241/lateinitializatioerror-field-has-not-been-initialized-error/