[플러터] SQflite 데이터베이스 생성하고 테스트해보기

모선·2022년 10월 31일

Flutter

목록 보기
1/3
post-thumbnail

이 글은 '11가지 앱을 만들며 배우는 크로스 플랫폼 앱개발 플러터 프로젝트' 라는 교재를 바탕으로 쓴 필기노트입니다.

sqflite 데이터베이스 생성하기

  1. sqflite 패키지를 사용하기 위해서 pubspec.yaml 파일에 종속성 추가하기 >> pub get하는 거 잊지말기!
    https://pub.dev/packages/sqflite/install
dependencies:
	flutter:
    	sdk: flutter
    sqflite: ^2.2.0+2
  1. dbhelper.dart 라는 파일을 새로 만든 뒤, DbHelper 클래스 함수를 작성한다. 클래스 안에는 데이터베이스의 버전을 나타내는 version과 데이터 베이스를 나타내는 db를 선언해준다.
class DbHelper{
	final int version = 1;
    Database? db;
}
  1. 데이터베이스가 존재하면 그걸 열고, 아니면 데이터 베이스를 생성하는 메서드를 만든다. >> openDb

데이베이스 작업은 실행하는 데 시간이 걸리고, 대량의 데이터를 처리하는 경우가 있으므로 비동기적으로 처리해야 한다.

만약 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 입니다.

  1. 마지막으로 데이터베이스를 반환한다.
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());
  }
  1. main.dart 파일로 와서 testDb() 메서드 호출하기
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/

profile
https://hy5sun.tistory.com/ << 이사중

0개의 댓글