Flutter: Как лучше всего создать экземпляр объекта SQFlite db при создании класса - PullRequest
1 голос
/ 21 марта 2019

Я изучаю Флаттер и приступаю ко второй программе. Эта программа использует SQFlite, и я скопировал большую часть обработки db из другой программы, которая, похоже, использует общий шаблон. Я сделал некоторые изменения к нему.

Что мне не нравится, так это необходимость каждый раз оценивать базу данных, чтобы определить, нужно ли ее создавать, как в «База данных db = await this.db;». Я бы предпочел, чтобы он был просто создан при создании класса, а затем просто использован как экземпляр. Тем не менее, я не знаком с "._internal" и не знаком с "фабрикой", поэтому не уверен, как лучше достичь этой цели.

Буду признателен, если кто-нибудь покажет мне, как лучше всего этого добиться. IE. Удалите необходимость в «Database db = await this.db;» и просто укажите ссылку на db.

Извлечение соответствующего кода для DbHelper выглядит следующим образом:

import 'package:sqflite/sqflite.dart';
import 'dart:async';
import 'dart:io';
import 'package:path_provider/path_provider.dart';
import 'noteRec.dart';

class DbHelper {
  static final DbHelper _dbHelper = DbHelper._internal();
  static const String sTblNotes = "Notes";
  static const String sColId = "Id";
  static const String sColTitle = "Title";
  static const String sColDetail = "Detail";

  DbHelper._internal();

  factory DbHelper() {
    return _dbHelper;
  }

  static Database _db;

  Future<Database> get db async {
    return _db != null ? _db : await initializeDb();
  }

  Future<Database> initializeDb() async {
    Directory dir = await getApplicationDocumentsDirectory();
    String path = dir.path + "/Notes.db";
    _db = await openDatabase(path, version: 1, onCreate: _createDb);
    return _db;
  }

  void _createDb(Database db, int newVersion) async {
    await db.execute(
        "CREATE TABLE $sTblNotes($sColId INTEGER PRIMARY KEY, $sColTitle TEXT, " +
            "$sColDetail TEXT)");
  }

  Future<List> getNoteRecs() async {
    Database db = await this.db;
    var result =
        await db.rawQuery("SELECT * FROM $sTblNotes ORDER BY $sColTitle ASC");
    return result;
  }

1 Ответ

0 голосов
/ 22 марта 2019

Следующее, кажется, делает то, что я хочу достичь.

dbHelper.dart

import 'dart:async';
import 'dart:io';
import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart';
import 'noteRec.dart';

class DbHelper {
  static final DbHelper _dbHelper = DbHelper._internal();
  static const String sTblNotes = "Notes";
  static const String sColId = "id";
  static const String sColTitle = "title";
  static const String sColDetail = "detail";
  static Database _db;

  DbHelper._internal();

  factory DbHelper() {
    return _dbHelper;
  }

  Future<bool> openDb() async {
    if (_db == null) {
      Directory dir = await getApplicationDocumentsDirectory();
      _db = await openDatabase("${dir.path}/Notes.db",
          version: 1, onCreate: _createDb);
    }
    return (_db != null);
  }

  void _createDb(Database db, int newVersion) async {
    await db.execute(
        "CREATE TABLE $sTblNotes($sColId INTEGER PRIMARY KEY, $sColTitle TEXT, " +
            "$sColDetail TEXT)");
  }

  Future<List> getNoteRecs() async {
    return await _db
        .rawQuery("SELECT * FROM $sTblNotes ORDER BY $sColTitle ASC");
  }

main.dart

import 'package:flutter/material.dart';
import 'dbHelper.dart';
import 'NotesList.dart';

DbHelper _dbHelper = DbHelper();

void main() async {
  await _dbHelper.openDb();
  runApp(MaterialApp(home: NotesList()));
}
...