카테고리 없음

flutter sqflite 사용법

햎피 2022. 6. 16. 22:46
반응형

flutter에서 데이터를 로컬에 저장하는 방법은 두가지가 있다.

하나는 shared preference이고 다른 하나는 sqflite이다.

 

shared preference의 경우에는, 자동 로그인 같은 간단한 데이터를 저장하고 싶을 때 사용한다.

sqflite는 디바이스에 많은 데이터를 저장 하고, 쿼리를 요청할 때 사용한다.

 

먼저, puspec.yaml 파일에 dependency를 추가해준다.

dependencies:
  sqflite:

 

1. 데이터베이스 열기

Future<Database> get database async {
    if (_db != null) return _db;
    _db = openDatabase(join(await getDatabasesPath(), 'Record5.db'),
        onCreate: (db, version) => _createDb(db), version: 1);
    return _db;
  }
  
static void _createDb(Database db) {
    db.execute(
      "CREATE TABLE Record(date DATETIME PRIMARY KEY, silence BOOL, promise BOOL, visu BOOL, excercise BOOL, reading BOOL, recording BOOL)",
    );
  }

opendatabase : getDatabasesPath()의 경로에서 Record5.db라는 파일을 생성하고 데이터베이스를 연다.

onCreate : 데이터베이스에서 CREATE TABLE이다. (테이블 생성), 버전을 설정할수도 있다.

 

2. DB에 데이터 추가

  Future<void> insertRecord(Record record) async {
    final db = await database;

    await db.insert("Record", record.toMap(),
        conflictAlgorithm: ConflictAlgorithm.replace);
  }

await를 이용해서 데이터베이스 reference를 얻고,

해당 데이터가 두번 추가되는 경우를 막기 위해서 conflictalgorithm을 사용한다.

conflictalgorithm.replace를 사용하면 이전 데이터를 갱신한다.

 

3. 전체 데이터 가져오기

Future<List<Record>> getAllRecord() async {
    final db = await database;

    final List<Map<String, dynamic>> maps = await db.query('Record');

    return List.generate(maps.length, (i) {
      return Record(
          date: maps[i]['date'],
          silence: maps[i]['silence'],
          promise: maps[i]['promise'],
          visu: maps[i]['visu'],
          excercise: maps[i]['excercise'],
          reading: maps[i]['reading'],
          recording: maps[i]['recording']);
    });
  }

모든 데이터 리스트를 가져올 수 있다.

그리고, List<Map<String,dynamic>을 List<item>으로 변환해야한다. (여기서 item은 Record)

 

4. 특정 데이터 가져오기

Future<dynamic> getRecord(DateTime date) async {
    final db = await database;

    final List<Map<String, dynamic>> maps = (await db.query(
      'Record',
      where: 'date = ?',
      whereArgs: [date],
    ));

    return maps.isNotEmpty ? maps : null;
  }

 

db에 존재하는 특정 데이터를 가져올 수 있다. 여기서는 date column에 있는 특정 데이터를 가져왔다.

 

 

5. 데이터 삭제

Future<void> deleteRecord(DateTime date) async {
    final db = await database;

    await db.delete(
      "Record",
      where: "record = ?",
      whereArgs: [date],
    );
  }

Record 데이터를 삭제한다.

 

 

다음은 전체 코드이다.

class DBHelper {

  var _db;
  var _dbname = 'Record5.db';
  
  Future<Database> get database async {
    if (_db != null) return _db;
    _db = openDatabase(join(await getDatabasesPath(), 'Record5.db'),
        onCreate: (db, version) => _createDb(db), version: 1);
    return _db;
  }

  static void _createDb(Database db) {
    db.execute(
      "CREATE TABLE Record(date DATETIME PRIMARY KEY, silence BOOL, promise BOOL, visu BOOL, excercise BOOL, reading BOOL, recording BOOL)",
    );
  }

  Future<void> insertRecord(Record record) async {
    final db = await database;

    await db.insert("Record", record.toMap(),
        conflictAlgorithm: ConflictAlgorithm.replace);
  }

  Future<List<Record>> getAllRecord() async {
    final db = await database;

    final List<Map<String, dynamic>> maps = await db.query('Record');

    return List.generate(maps.length, (i) {
      return Record(
          date: maps[i]['date'],
          silence: maps[i]['silence'],
          promise: maps[i]['promise'],
          visu: maps[i]['visu'],
          excercise: maps[i]['excercise'],
          reading: maps[i]['reading'],
          recording: maps[i]['recording']);
    });
  }

  Future<dynamic> getRecord(DateTime date) async {
    final db = await database;

    final List<Map<String, dynamic>> maps = (await db.query(
      'Record',
      where: 'date = ?',
      whereArgs: [date],
    ));

    return maps.isNotEmpty ? maps : null;
  }

  Future<void> updateRecord(Record record) async {
    final db = await database;

    await db.update(
      "Record",
      record.toMap(),
      where: "date = ?",
      whereArgs: [record.date],
    );
  }

  Future<void> deleteRecord(DateTime date) async {
    final db = await database;

    await db.delete(
      "Record",
      where: "record = ?",
      whereArgs: [date],
    );
  }
}

 

반응형