Skip to content
代码片段 群组 项目
从无法访问的项目中派生。
db_manager.dart 4.11 KiB
import 'package:flutter/material.dart';
import 'package:jihu_gitlab_app/modules/issues/issue_draft_entity.dart';
import 'package:jihu_gitlab_app/modules/projects/group_details/group_and_project.dart';
import 'package:jihu_gitlab_app/modules/todo_list/widgets/member_entity.dart';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';

class DbManager {
  static const int _version = 5;
  static const String _name = "jihu.db";
  static final DbManager _instance = DbManager._internal();
  Database? _db;

  DbManager._internal();

  factory DbManager.instance() => _instance;

  Future<Database> open() async {
    var databasesPath = await getDatabasesPath();
    return await openDatabase(join(databasesPath, _name), version: _version, onCreate: _onCreate, onUpgrade: _onUpgrade);
  }

  Future<Database> getDb() async {
    _db ??= await open();
    return Future.value(_db);
  }

  close() {
    return _db?.close();
  }

  _onCreate(Database db, int version) {
    debugPrint('version: $version');
    _onUpgrade(db, 1, version);
  }

  _onUpgrade(Database db, int oldVersion, int newVersion) {
    debugPrint('onUpgrade:oldVersion -> $oldVersion, newVersion -> $newVersion');
    for (int i = oldVersion + 1; i <= newVersion; i++) {
      switch (i) {
        case 2:
          db.execute(MemberEntity.createTableSql());
          db.execute("DROP TABLE IF EXISTS assignees");
          break;
        case 3:
          db.execute(IssueDraftEntity.createTableSql());
          break;
        case 4:
          db.execute(GroupAndProjectEntity.createTableSql);
          break;
        case 5:
          db.execute(GroupAndProjectEntity.addStarredColumn);
          break;
        default:
          break;
      }
    }
  }

  Future<int> insert(String table, Map<String, Object?> values, {String? nullColumnHack, ConflictAlgorithm? conflictAlgorithm}) async {
    var db = await getDb();
    return db.insert(table, values, nullColumnHack: nullColumnHack, conflictAlgorithm: conflictAlgorithm);
  }

  Future<List<int>> batchInsert(String tableName, List<Map<String, dynamic>> values, {String? nullColumnHack, ConflictAlgorithm? conflictAlgorithm}) async {
    var db = await getDb();
    return db.transaction((txn) async {
      List<int> result = [];
      for (var element in values) {
        int id = await txn.insert(tableName, element, nullColumnHack: nullColumnHack, conflictAlgorithm: conflictAlgorithm);