Исключение SqfliteDatabaseException (исключение базы данных(database_closed))

#ios #flutter #dart

Вопрос:

Две страницы в приложении перечислены в базе данных(sqlite). но когда я хочу переключаться между страницами, я получаю такую ошибку: исключение SqfliteDatabaseException (исключение базы данных(database_closed))

пожалуйста, помоги мне.. Я не понимаю, почему вижу эту ошибку.

 import 'dart:async';
import 'dart:io';
import 'dart:typed_data';
import 'package:bankingapp/models/coin.dart';
import 'package:bankingapp/models/histories.dart';
import 'package:flutter/services.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

class DbHelper {
  static Database? _db;

  Future<Database> get db async {
    return _db ??= await initDb();
  }

  Future<Database> initDb() async {
    var dbFolder = await getDatabasesPath();
    String path = join(dbFolder, 'app.db');

    // Delete any existing database:
    await deleteDatabase(path);

    // Create the writable database file from the bundled demo database file:
    try {
      await Directory(dirname(path)).create(recursive: true);
    } catch (_) {}
    ByteData data =
        await rootBundle.load(join("assets/database", "bankingapp.db"));
    List<int> bytes =
        data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
    await new File(path).writeAsBytes(bytes, flush: true);

    //open the database
    return await openDatabase(path);

    /*
    var dbFolder = await getDatabasesPath();
    String path = join(dbFolder, 'app.db');
    
    return await openDatabase(path);*/
  }

  Future<List<Histories>> getHistories() async {
    var dbClient = await db;
    var result = await dbClient.rawQuery("SELECT * FROM Histories");
    return result.map((data) => Histories.fromMap(data)).toList();
  }

  Future<List<Coins>> getCoins() async {
    var dbClient = await db;
    var result = await dbClient.rawQuery("SELECT * FROM Coins");
    return result.map((data) => Coins.fromMap(data)).toList();
  }
}
 

Ответ №1:

Сначала удалите приложение с устройства и запустите flutter clean , а затем создайте новое приложение и запустите его снова, чтобы проверить, не произошла ли ошибка.

Затем проверьте, ограничило ли устройство, на котором вы запускаете приложение, ваше приложение или нет, и посмотрите, требуется ли вашему устройству какое-либо конкретное разрешение.

Если это все еще происходит в соответствии с предоставленной вами информацией, похоже, что проблема либо в том, что база данных закрывается, либо она не открывается, это может быть связано со многими причинами, такими как несоблюдение надлежащей инициализации или даже просто забывание поставить await . Проверьте код инициализации базы данных, в котором вы открываете свою базу данных, или нет, а затем проверьте, не закрываете ли вы где-нибудь базу данных по ошибке, что должно было быть сделано только после завершения работы приложения.

Если вы выполнили оба вышеперечисленных шага правильно, проверьте местоположение и сопоставление своей базы данных.

Если ничего не работает, пожалуйста, попробуйте следовать официальным документам и примеру sqflite, так как ваш код отличается от кода, показанного в примере плагина.

Комментарии:

1. Надеюсь, это поможет, если да, то, пожалуйста, поднимите голос и отметьте его правильно, чтобы другим было легче найти ответ на ту же ошибку

2. я проверил все, что ты сказал. я нигде не использую функцию «закрыть базу данных»…

3. Я отредактировал свой ответ в соответствии с вашим обновленным вопросом. пожалуйста, проверьте это, если все еще есть какие-либо проблемы, не стесняйтесь задавать их в комментариях.