Untitled
unknown
plain_text
2 years ago
2.8 kB
10
Indexable
import 'dart:io';
import 'dart:isolate';
import 'package:archive/archive.dart';
import 'package:flutter/services.dart';
import 'package:flutter_isolate/flutter_isolate.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart' as p;
class DataService {
Database? _database;
static final DataService _dataService = DataService._internal();
DataService._internal();
static Database get database => _dataService._database!;
static DataService get instance => _dataService;
Future<void> initDatabase() async {
Directory documentsDirectory = await getDatabaseDirectory();
String path = p.join(
documentsDirectory.path, 'gurbani_database.sqlite/database.sqlite');
bool exists = await File(path).exists();
if (!exists) {
await decompressAndLoadDatabase();
}
_dataService._database = await openDatabase(path);
}
static Future<Directory> getDatabaseDirectory() async {
if (Platform.isAndroid) {
return await getExternalStorageDirectory();
} else if (Platform.isIOS) {
return await getApplicationDocumentsDirectory();
} else {
// For other platforms, you can define your fallback directory
return await getApplicationDocumentsDirectory();
}
}
static Future<void> decompressAndLoadDatabase() async {
ByteData data = await rootBundle.load("assets/database.zip");
ReceivePort receivePort = ReceivePort();
FlutterIsolate isolate = await FlutterIsolate.spawn(
_decompressDatabase,
{"data": data, "sendPort": receivePort.sendPort},
);
await for (var msg in receivePort) {
if (msg == 1) {
isolate.kill();
receivePort.close();
break;
}
}
}
static Future<void> _decompressDatabase(Map<String, dynamic> args) async {
final ByteData data = args['data'];
final SendPort sendPort = args['sendPort'];
List<int> bytes =
data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
Directory documentsDirectory = await getDatabaseDirectory();
String path = p.join(documentsDirectory.path, 'gurbani_database.sqlite');
File file = File("$path.zip");
await file.writeAsBytes(bytes, flush: true);
Archive archive = ZipDecoder().decodeBytes(await file.readAsBytes());
for (ArchiveFile archiveFile in archive) {
String fileName = archiveFile.name;
List<int> data = archiveFile.content;
File outFile = File("$path/$fileName");
outFile = await outFile.create(recursive: true);
await outFile.writeAsBytes(data, flush: true);
}
sendPort.send(1); // Finished decompression
}
}
Editor is loading...
Leave a Comment