flutter загрузка базы данных по кнопке
Сделал кнопку в приложении, замысел такой, что по её нажатию происходит обновление базы данных sqlite в приложении
actions: [
IconButton(
icon: Icon(Icons.refresh),
onPressed: () async {
await DatabaseProvider.updateDatabase();
},
),
],
static void updateDatabase() async {
String fileName = 'database.sqlite';
String dir = (await getApplicationDocumentsDirectory()).path;
File file = File('$dir/$fileName');
// Удаление старой базы данных
await file.delete();
// Скачивание новой базы данных и запись её в файл
String url = 'https://site.com/database.sqlite';
http.Response response = await http.get(Uri.parse(url));
await file.writeAsBytes(response.bodyBytes);
// Открытие базы данных
Database database = await DatabaseProvider.open(file);
// Использование базы данных
// ...
}
Полный код
import 'dart:io';
import 'package:flutterapp/article.dart';
import 'package:path/path.dart';
import 'dart:typed_data';
import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';
import 'package:http/http.dart' as http;
class DatabaseProvider {
static Database _database;
static Future<Database> open(File file) async {
if (_database != null) {
return _database;
}
_database = await openDatabase(
file.path,
version: 1,
onCreate: (db, version) async {
// Код создания базы данных
},
onUpgrade: (db, oldVersion, newVersion) async {
// Код обновления базы данных
},
);
return _database;
}
static void updateDatabase() async {
String fileName = 'database.sqlite';
String dir = (await getApplicationDocumentsDirectory()).path;
File file = File('$dir/$fileName');
// Удаление старой базы данных
await file.delete();
// Скачивание новой базы данных и запись её в файл
String url = 'https://site.com/database.sqlite';
http.Response response = await http.get(Uri.parse(url));
await file.writeAsBytes(response.bodyBytes);
// Открытие базы данных
Database database = await DatabaseProvider.open(file);
// Использование базы данных
// ...
}
static final DatabaseProvider _singleton = DatabaseProvider._internal();
factory DatabaseProvider() {
return _singleton;
}
DatabaseProvider._internal();
Future<Database> init() async {
var databasesPath = await getDatabasesPath();
var path = join(databasesPath, "database.sqlite");
try {
await Directory(dirname(path)).create(recursive: true);
} catch (_) {}
ByteData data = await rootBundle.load(join("assets", "database.sqlite"));
List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
await new File(path).writeAsBytes(bytes, flush: true);
var db = await openDatabase(path, readOnly: true);
return db;
}
Future<Database> get database async {
if (_database != null) return _database;
_database = await init();
return _database;
}
Подскажите, что не так в этом коде или вообще чисто фактически flutter такое действо не допускает?