0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Flutter】SQLiteデータベースの扱い方

Posted at

sqflite パッケージを使って SQLite データベースとやり取りできる

事前準備

sqflite パッケージを利用するため pubspec.yaml

dependencies:
  flutter:
    sdk: flutter
  path_provider: ^2.0.14
  sqflite: ^2.2.8+1

sqflite を追記する
(path_provider も使用するのでついでに追記する)

テーブル作成

import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

void create() async {
  final directory = await getLibraryDirectory();
  final path = join(directory.path, 'my_db.db');

  // テーブル作成
  await openDatabase(
    path,
    version: 1,
    onCreate: (newDb, version) async {
      await newDb.execute('''
        CREATE TABLE sample(
          id INTEGER PRIMARY KEY,
          name TEXT
        )
      ''');
    },
  );
}

openDatabase() には onCreate というパラメータがあり、 path で指定したデータベースが存在しなかった場合、呼び出される。
ここを利用してテーブルを作成やレコード登録など初期処理を行うことができる。

また、2番目のパラメータとして version を指定でき、ここが上がったときに呼び出される onUpgrade や、下がった時に呼び出される onDowngrade を利用して、スキーマ変更などを行うこともできる。

レコード登録

void insert() async {
  final directory = await getLibraryDirectory();
  final path = join(directory.path, 'my_db.db');

  final db = await openDatabase(path);

  await db.transaction((txn) async {
    await txn.insert('sample', {'id': 1, 'name': 'サンプルレコード1'});
    await txn.insert('sample', {'id': 2, 'name': 'サンプルレコード2'});
    await txn.insert('sample', {'id': 3, 'name': 'サンプルレコード3'});
    await txn.insert('sample', {'id': 4, 'name': 'サンプルレコード4'});
  });
}

openDatabase()はDBが存在するときはDB情報を返してくれるので、それを介して処理を行う。
transaction() でトランザクションを張り、実際の登録は insert() を使用して行う。1番目の引数でテーブル名を指定して、実際に登録する値を2番目の引数としてMap型で指定する。

レコード更新

void update() async {
  final directory = await getLibraryDirectory();
  final path = join(directory.path, 'my_db.db');

  final db = await openDatabase(path);

  await db.transaction((txn) async {
    await txn.update('sample', {'name': '【更新】サンプルレコード2'}, where: 'id = ?', whereArgs: [2]);
    await txn.update('sample', {'name': '【更新】サンプルレコード3'}, where: 'id = ?', whereArgs: [3]);
    await txn.update('sample', {'name': '【更新】サンプルレコード4'}, where: 'id = ?', whereArgs: [4]);
  });
}

update() を使用して行う。insertとほぼ同じ。

レコード削除

void delete() async {
  final directory = await getLibraryDirectory();
  final path = join(directory.path, 'my_db.db');

  final db = await openDatabase(path);

  await db.transaction((txn) async {
    await txn.delete('sample', where: 'id = ?', whereArgs: [3]);
    await txn.delete('sample', where: 'id = ?', whereArgs: [4]);
  });
}

delete() を使用する。

レコード取得

void select() async {
  final directory = await getLibraryDirectory();
  final path = join(directory.path, 'my_db.db');

  final db = await openDatabase(path);

  final List<Map<String, dynamic>> result = await db.query(
    'sample',
    where: 'id in (?,?,?,?)',
    whereArgs: [1,2,3,4],
  );

  print(result);
}

query() を使用する。例としてWHERE句しか指定していないが、 ORDER BYGROUP BY なども指定可能。

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?