Existing databases
Using moor with an existing database
You can use moor with a pre-propulated database that you ship with your app.
Including the database
First, create the sqlite3 database you want to ship with your app. You can create a database with the sqlite3 CLI tool on your development machine. Of course, you can also create the database programmatically by using a library like sqlite3 (or even moor itself).
To ship that database to users, you can include it as a flutter asset. Simply include it in your pubspec:
flutter:
assets:
- assets/my_database.dbExtracting the database
To initialize the database before using moor, you need to extract the asset from your app onto the device. In moor, you can use a LazyDatabase to perform that work just before your moor database is opened:
import 'package:moor/moor.dart';
import 'package:flutter/services.dart' show rootBundle;
LazyDatabase _openConnection() {
return LazyDatabase(() async {
// put the database file, called db.sqlite here, into the documents folder
// for your app.
final dbFolder = await getApplicationDocumentsDirectory();
final file = File(p.join(dbFolder.path, 'app.db'));
if (!await file.exists()) {
// Extract the pre-populated datbaase file from assets
final blob = await rootBundle.load('assets/my_database.db');
await file.writeAsBytes(blob);
}
return VmDatabase(file);
});
}Finally, use that method to open your database:
@UseMoor(tables: [Todos, Categories])
class MyDatabase extends _$MyDatabase {
MyDatabase() : super(_openConnection());
// ...Last modified January 23, 2021: Add example on existing databases (2da9175a)