📦

ローカルデータベース(sqflite)を使ってみた

2024/05/12に公開

はじめに

アプリ開発におけるローカルデータベースの利用機会は多いですよね。この記事では、sqfliteを使用してローカルデータベースを実装した方法を共有したいと思います。

sqfliteパッケージの概要

  • Flutterアプリ内でSQLiteデータベースを使用するためのパッケージ
  • 軽量でありながら、デバイス内にデータを保存する組み込み型のデータベース
  • SQLiteデータベースの作成、テーブルの定義、データの読み書きなどが簡単に行える

※sqflite公式パッケージ
https://pub.dev/packages/sqflite#sql-helpers

実装例

SQL helpersを実装してみました。

  • 記載内容
    • execute
    • openDatabase
    • query
    • insert
    • update
    • delete
  // テーブルの作成
  static Future<void> createTables(sql.Database database) async {
    await database.execute("""CREATE TABLE items(
  id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
  title TEXT,
  createdAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
  )
  """);
  }

  //データベースに接続
  static Future<sql.Database> db() async {
    return sql.openDatabase(
      //パス指定
      'my.db',
      version: 1,
      onCreate: (sql.Database database, int version) async {
        await createTables(database);
      },
    );
  }

  //データの取得
  static Future<List<Map<String, dynamic>>> getItems() async {
    final db = await SQLHelper.db();

    return db.query('items', orderBy: "id");
  }

  //itemsテーブルにデータを追加
  static Future<int> createItem(String title) async {
    final db = await SQLHelper.db();

    final data = {'title': title};
    final id = await db.insert('items', data,
        conflictAlgorithm: sql.ConflictAlgorithm.replace);
    return id;
  }

  //レコードの更新
  static Future<int> updateItem(int id, String title) async {
    final db = await SQLHelper.db();

    final data = {'title': title, 'updatedAt': DateTime.now().toString()};
    final result = await db.update(
      'items',
      data,
      where: "id = ?",
      whereArgs: [id],
    );
    return result;
  }

  //レコードの削除
  static Future<void> deleteItem(int id) async {
    final db = await SQLHelper.db();

    try {
      await db.delete("items", where: "id = ?", whereArgs: [id]);
    } catch (err) {
      debugPrint("$err");
    }
  }

Discussion