Я изучаю Флаттер и приступаю ко второй программе. Эта программа использует 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;
}