首页 > 解决方案 > Flutter Sqflite 数据库在关闭 App 后会消失

问题描述

我正在开发一个颤振的应用程序。我正在使用 Sqflite 插件在设备上保存数据。

一切运行良好。我能够持久化数据并读取以显示在列表中。

但是当我关闭 de App 时,数据库丢失了,我必须再次持久化所有数据。

是否有可能将数据库文件保存在临时文件夹中,因此在关闭应用程序时将其删除?

拜托,谁能帮我理解我可能会错过什么?

添加一些代码:

这是我获得数据库的地方

Future<Database> _database;

  Future<Database> getDatabase() {
    _database ??= _initDatabase();
    return _database;
  }

Future<Database> _initDatabase() async {
    var databasesPath = await getDatabasesPath();
    print('databasesPath: $databasesPath');
    var dbpath = join(databasesPath, 'paperless.db');
    print('dbpath: $dbpath');

// Make sure the directory exists
    try {
      await Directory(databasesPath).create(recursive: true);
    } catch (_) {}

    return await openDatabase(
      dbpath,
      version: 1,
      onCreate: (Database db, int version) async {
        await db.execute(
          'CREATE TABLE $TABLE_ACCOUNTS ($COLUMN_AUTO_ID INTEGER PRIMARY KEY, '
          '$COLUMN_ACCOUNT_ID TEXT, '
          '$COLUMN_CUSTOMER_PICTURE TEXT, $COLUMN_DOC_FRONT TEXT, '
          '$COLUMN_DOC_BACK TEXT, $COLUMN_SIGNATURE TEXT, '
          '$COLUMN_GENDER INTEGER, $COLUMN_FIRST_NAME TEXT, '
          '$COLUMN_LAST_NAME TEXT, $COLUMN_DOC_TYPE TEXT, '
          '$COLUMN_BIRTHDAY TEXT, $COLUMN_DOC_NUMBER TEXT, '
          '$COLUMN_DOC_EXPIRATION_DATE TEXT, $COLUMN_ADDRESS TEXT, '
          '$COLUMN_ADDRESS2 TEXT, $COLUMN_COUNTRY TEXT, '
          '$COLUMN_PROVINCE TEXT, $COLUMN_CITY TEXT, '
          '$COLUMN_HAS_JOB TEXT, $COLUMN_SALARY_RANGE TEXT, '
          '$COLUMN_JOB_DESIGNATION TEXT, $COLUMN_COMPANY_NAME TEXT, '
          '$COLUMN_JOB_TYPE TEXT, $COLUMN_COMPANY_TELEPHONE TEXT, '
          '$COLUMN_COMPANY_MONTHLY_INCOME_RANGE TEXT, $COLUMN_COMPANY_OWN_JOB TEXT, '
          '$COLUMN_COMPANY_BUSINESS_TYPE TEXT)',
        );
      },
    );
  }

当我需要从数据库中获取帐户时,我使用此方法

Future<List<LowKYCAccount>> getLocalLowKYCAccount() async {
    final db = await getDatabase();
    var accounts = await db.rawQuery('SELECT * FROM $TABLE_ACCOUNTS');
    var accountsList = List<LowKYCAccount>();
    accounts.forEach((account) {
      LowKYCAccount kycAccount = LowKYCAccount.fromMap(account);
      accountsList.add(kycAccount);
    });
    return accountsList;
  }

这就是我如何保存数据

Future<LowKYCAccount> saveAccountLocaly(LowKYCAccount account) async {
    print('account: $account');
    final db = await getDatabase();

    await db.transaction((transaction) async {
      account.autoId = await transaction.rawInsert(
          'INSERT INTO $TABLE_ACCOUNTS($COLUMN_ACCOUNT_ID, $COLUMN_CUSTOMER_PICTURE, $COLUMN_DOC_FRONT, $COLUMN_DOC_BACK, $COLUMN_SIGNATURE, $COLUMN_GENDER, $COLUMN_FIRST_NAME, $COLUMN_LAST_NAME, $COLUMN_DOC_TYPE, $COLUMN_BIRTHDAY, $COLUMN_DOC_NUMBER, $COLUMN_DOC_EXPIRATION_DATE, $COLUMN_ADDRESS, $COLUMN_ADDRESS2, $COLUMN_COUNTRY, $COLUMN_PROVINCE, $COLUMN_CITY, $COLUMN_HAS_JOB, $COLUMN_SALARY_RANGE, $COLUMN_JOB_DESIGNATION, $COLUMN_COMPANY_NAME, $COLUMN_JOB_TYPE, $COLUMN_COMPANY_TELEPHONE, $COLUMN_COMPANY_MONTHLY_INCOME_RANGE, $COLUMN_COMPANY_OWN_JOB, $COLUMN_COMPANY_BUSINESS_TYPE) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
          account.toList());
    });
    //account.autoId = await db.insert(TABLE_ACCOUNTS, account.toMap());
    return account;
  }

我使用提供程序从我的 UI 调用该方法:

Future<void> saveAccountLocaly(LowKYCAccount account) async {
    await DBProvider.db
        .saveAccountLocaly(account)
        .then((account) => _localLowKycAccounts.add(account));
    notifyListeners();
  }

我使用此方法使用提供程序从 UI 获取数据:

Future<void> fetchLocalLowKycAccounts() async {
    _localLowKycAccounts = await DBProvider.db.getLocalLowKYCAccount();
    notifyListeners();
  }

当应用程序第一次打开时,我调用从 didChangeDependencies() 获取数据

由于没有数据,我会显示一条消息,通知用户没有数据。

当用户保存一些数据时,UI 会重建显示持久化的数据。但是,关闭应用程序后,这些数据会丢失,就像用户从未插入任何数据一样。

标签: fluttersqflite

解决方案


推荐阅读