(Флаттер) Автоматическое создание базы данных SQFLite при создании нового проекта - PullRequest
0 голосов
/ 20 марта 2019

Я создаю приложение, в котором пользователь может создавать несколько проектов. Я хочу, чтобы у каждого проекта была своя уникальная база данных, поскольку имя столбцов (будет 6-7 столбцов) будет одинаковым, но значения в столбцах для нового проекта будут другими.

Как создать новую базу данных SQFlite каждый раз, когда пользователь создает новый проект?

Или есть какой-то другой лучший способ добиться этого?

Вот мой код для базы данных, которую я создал вручную, если вы хотите просмотреть ее:

    class DatabaseHelper {
  static final DatabaseHelper _instance = new DatabaseHelper.internal();

  factory DatabaseHelper() => _instance;

  final String tableUser = "userTable";
  final String columnId = "id";

  final String columnRuns = "runs";

  static Database _db;

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

    return _db;
  }

  DatabaseHelper.internal();

  initDb() async {
    Directory documentDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentDirectory.path,
        "maindbnew.db"); //home://directory/files/maindb.db

    var ourDb = await openDatabase(path, version: 1, onCreate: _onCreate);
    return ourDb;
  }

   void _onCreate(Database db, int newVersion) async {
    await db.execute(
        "CREATE TABLE $tableUser($columnId INTEGER PRIMARY KEY, $columnRuns INTEGER)");
  }

  //CRUD - CREATE, READ, UPDATE, DELETE

  //Insertion
  Future<int> saveUser(User user) async {
    var dbClient = await db;
    int res = await dbClient.insert("$tableUser", user.toMap());
    return res;
  }

  //Get Users
  Future<List> getAllUsers() async {
    var dbClient = await db;
    var result = await dbClient.rawQuery("SELECT * FROM $tableUser");

    return result.toList();
  }

  Future<int> getCount() async {
    var dbClient = await db;
    return Sqflite.firstIntValue(
        await dbClient.rawQuery("SELECT COUNT(*) FROM $tableUser"));
  }

  Future<User> getUser(int id) async {
    var dbClient = await db;

    var result = await dbClient
        .rawQuery("SELECT * FROM $tableUser WHERE $columnId = $id");
    if (result.length == 0) return null;
    return new User.fromMap(result.first);
  }

  Future<int> deleteUser(int id) async {
    var dbClient = await db;

    return await dbClient
        .delete(tableUser, where: "$columnId = ?", whereArgs: [id]);
  }

  Future<int> updateUser(User user) async {
    var dbClient = await db;
    return await dbClient.update(tableUser, user.toMap(),
        where: "$columnId = ?", whereArgs: [user.id]);
  }

  Future close() async {
    var dbClient = await db;
    return dbClient.close();
  }
}



 class User {
  int _runs;

  int _id;

  User(this._runs);

  User.map(dynamic obj) {
    this._runs = obj['runs'];

    this._id = obj['id'];
  }

  int get runs => _runs;

  int get id => _id;

  Map<String, dynamic> toMap() {
    var map = new Map<String, dynamic>();
    map["runs"] = _runs;

    if (id != null) {
      map["id"] = _id;
    }
    return map;
  }

  User.fromMap(Map<String, dynamic> map) {
    this._runs = map["runs"];

    this._id = map["id"];
  }
}

P.S. У меня сейчас только один столбец, я добавлю еще позже.

...