我目前在桌面网络(使用 Chrome 作为浏览器)上使用带有 Angular Ionic 的 Capacitor Community Sqlite 库时遇到问题。
@capacitor-community/sqlite
https://www.npmjs.com/package/@capacitor-community/sqlite
困难的是,错误只发生大约 1% 的时间(百分之一)。真的很难重现。这可能是我的应用程序中触发的某种竞争条件。
在浏览器中刷新页面后,我有时会收到此错误:
Error: Run: ExecSet: in saveToStore SetDBToStore: undefined
所以每当我使用插件初始化数据库时,每当我打开它时,这基本上都会发生
发生该错误后,对数据库的后续调用将失败并出现相同的错误:
Error: Run: ExecSet: in saveToStore SetDBToStore: undefined
Error: Query: <database-name> database not opened
到目前为止,我只在网络上注意到这个错误,但可以肯定的是,它也有可能在本机上发生,因为与在网络上开发时相比,我更少地查看控制台,而且我根本没有刷新那里的页面.
所以我的问题基本上是,这个错误的原因可能是什么,返回了未定义的值。
我认为这与 jeepSqliteElement 有关,因为在查看 SetDBToStore 的源代码时:
static async setDBToStore(mDb, dbName, store) {
try {
// export the database
const data = mDb.export();
// store the database
await UtilsStore.saveDBToStore(dbName, data, store);
return Promise.resolve();
}
catch (err) {
return Promise.reject(`SetDBToStore: ${err.message}`);
}
}
我也在网络上调用 saveToStore 方法,这里提到:
https://github.com/capacitor-community/sqlite/issues/545
我知道这可能看起来可以忽略不计,但应用程序每刷新 1/100 次就会完全中断,这也可能会阻止用户停留在页面上。
我用一个相当丑陋但有效的解决方案解决了这个问题:
错误发生在我的 downloadUserData 方法中,请参见下文:
await firstValueFrom(this.createInitialDataService.isDatabaseInit$.pipe(filter(Boolean)));
this.dataSyncService.downloadUserData(activeTurbo).pipe(first()).subscribe();
await firstValueFrom(this.createInitialDataService.isDatabaseInit$.pipe(filter(Boolean)));
setTimeout(() => {this.dataSyncService.downloadUserData(activeTurbo).pipe(first()).subscribe();
}, 100); // give the app some time to breathe to prevent the infamous bug