虎視眈々と

Flutter × Firebaseを研究するアプリエンジニア

FlutterでローカルDBを使う

f:id:superman199323:20181123170128j:plain

FlutterでローカルDBを使う

FlutterでローカルDBを使う方法について説明します。

導入

今回導入するプラグインはこちら

pub.dartlang.org

pubspec.ymlを編集します。

dependencies:
  flutter:
    sdk: flutter

  sqflite: ^0.12.2

書いたら下記のコマンドを実行しましょう

flutter packages get

実装

まずはDbHelperを作りましょう。

import 'dart:async';
import 'dart:io';

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

class DbHelper {
  static Database _db;

  static Future<Database> get db async {
    if (_db != null) return _db;
    _db = await _initDb();
    return _db;
  }

  static _initDb() async {
    Directory documentDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentDirectory.path, "group_album.db");
    var db = await openDatabase(path, version: 1, onCreate: _onCreate);
    return db;
  }

  static _onCreate(Database db, int version) async {
    await db.execute(
        "CREATE TABLE messages(messageId TEXT PRIMARY KEY, userId TEXT, groupId TEXT, message TEXT, createdAt TEXT)"
    );
  }
}

次に使うときはこうします。

select はこうします。

Future<List<Message>> _getMessages(String messageId) async {
    var dbClient = await DbHelper.db;
    List<Map> list = await dbClient.execute(
        'SELECT * FROM messages where messageId = ' + '\'$messageId\'');
    List<Message> messages = new List();
    for (int i = 0; i < list.length; i++) {
      messages.add(new Message(list[i]["messageId"], list[i]["userId"],
          list[i]["groupId"], list[i]["message"], list[i]["createdAt"]));
    }
    print(messages.length);
    return messages;
  }

他にもいろんなSQLが発行できます。