flutter - 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 会重建显示持久化的数据。但是,关闭应用程序后,这些数据会丢失,就像用户从未插入任何数据一样。
解决方案
推荐阅读
- python - 无法在 Pycharm Windows 中激活 venv
- python - Scipy multivariate_normal cdf 与手动计算不同
- reactjs - 通过 react-final-form 中的 API 集成从 react-select/creatable 中选择
- swift - 如何在 SwiftUI 中修改后阻止位置修改器更改视图的大小?
- r - R:unnest 函数如何工作以及如何克服不兼容的长度错误?
- vue.js - 如何在保留原始模板的同时覆盖 Bootstrap Vue 组件的方法?
- terraform - 如何在 Terraform 中重用资源中的数据?
- coq - if-then-else 条件下的案例拆分
- asp.net-core-webapi - 发布时无法命中 AspNetCore 3.1 MVC API 端点
- groovy - 编写 DRY Spock 测试