Untitled

 avatar
unknown
plain_text
a year ago
2.8 kB
26
Indexable
// create a singleton class to handle all the sqflite database related stuff
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();
  // factory DataService() {
  //   return _dataService;
  // }
  DataService._internal();

  static Database get database => _dataService._database! ;
  static DataService get instance => _dataService ;

  Future<void> initDatabase() async {
    Directory documentsDirectory = await getApplicationSupportDirectory();
    String path = p.join(
        documentsDirectory.path, 'gurbani_database.sqlite/database.sqlite');
    bool exists = await File(path).exists();
    if (!exists) {
      // await _decompressDatabase();
      await decompressAndLoadDatabase();
    }
    _dataService._database = await openDatabase(path);
  }

  @pragma('vm:entry-point')
  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) {
      // print(msg);
      if (msg == 1) {
        isolate.kill();
        receivePort.close();
        break;
      }
    }
  }

  @pragma('vm:entry-point')
  static Future<void> _decompressDatabase(Map<String, dynamic> args) async {
    // static Future<void> _decompressDatabase() async {
    final ByteData data = args['data'];
    // ByteData data = await rootBundle.load("assets/database.zip");
    final SendPort sendPort = args['sendPort'];

    List<int> bytes =
    data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
    Directory documentsDirectory = await getApplicationSupportDirectory();
    String path = "${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