Created
June 8, 2020 17:39
-
-
Save shivanchalaeologic/68e3120dca82e8a5b617df20e07b25b8 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'dart:async'; | |
import 'package:path/path.dart'; | |
import 'package:path_provider/path_provider.dart'; | |
import 'package:sembast/sembast.dart'; | |
import 'package:sembast/sembast_io.dart'; | |
class AppDatabase { | |
// Singleton instance | |
static final AppDatabase _singleton = AppDatabase._(); | |
// Singleton accessor | |
static AppDatabase get instance => _singleton; | |
// Completer is used for transforming synchronous code into asynchronous code. | |
Completer<Database> _dbOpenCompleter; | |
// A private constructor. Allows us to create instances of AppDatabase | |
// only from within the AppDatabase class itself. | |
AppDatabase._(); | |
// Database object accessor | |
Future<Database> get database async { | |
// If completer is null, AppDatabaseClass is newly instantiated, so database is not yet opened | |
if (_dbOpenCompleter == null) { | |
_dbOpenCompleter = Completer(); | |
// Calling _openDatabase will also complete the completer with database instance | |
_openDatabase(); | |
} | |
// If the database is already opened, awaiting the future will happen instantly. | |
// Otherwise, awaiting the returned future will take some time - until complete() is called | |
// on the Completer in _openDatabase() below. | |
return _dbOpenCompleter.future; | |
} | |
Future _openDatabase() async { | |
// Get a platform-specific directory where persistent app data can be stored | |
final appDocumentDir = await getApplicationDocumentsDirectory(); | |
// Path with the form: /platform-specific-directory/demo.db | |
final dbPath = join(appDocumentDir.path, 'StudentsDB.db'); | |
final database = await databaseFactoryIo.openDatabase(dbPath); | |
// Any code awaiting the Completer's future will now start executing | |
_dbOpenCompleter.complete(database); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment