Flutter Sqflite database will disappear after closing the App

Viewed 699

I am development a flutter App. I am using Sqflite plugin do persiste data on the device.

Everthing is running well. I am able to persiste data and read to show in a list.

But when I close de App, the database is lost and I have to persiste all the data again.

Is it possible that de database file is being saved in temporary folder, so it is deleted when the Application is closed?

Please, can anyone help me understand what I might be missing?

Adding some code:

this is where I get tha database

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)',
        );
      },
    );
  }

When I need to get the account from the database I use this method

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;
  }

This How I am saving the data

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;
  }

I am call the method from my UI using provider:

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

I am fetching the data from the UI using provider with this method:

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

When the App is first opned I call fetching the data from didChangeDependencies()

Since there is no data I show a message informing the user that there is no data.

When the user save some data, The UI is rebuild showing the persited data. But, after closing the App this data is lost, and is like the user never inserted any data.

0 Answers
Related