Android SQLite 挂起,没有错误或使用“DELETE FROM ${tableName}”命令成功

问题描述 投票:0回答:1

我有一个用于 android expo React Native 应用程序的 SQLite DB,使用包

expo-sqlite 13.2.2
。我正在尝试运行一个函数,该函数将清除数据库中的所有数据,以便用户可以从备份中恢复数据,但在执行第一个命令时,整个过程都会挂起。我的成功回调和失败回调中有 console.log 语句,但都没有执行。它只是挂断,没有任何反馈。

这似乎会导致数据库锁定,因为在数据清除失败后,应用程序的其余部分无法进行读取或写入。我到处都有日志语句,确认在 DELETE FROM 之后我的函数没有其他部分执行

我完全确定表名与真实表名匹配。我尝试删除与数据库中任何其他表没有任何外键关系的单个表,但得到相同的结果。顺便说一句,我的 TABLE_NAMES 枚举中大约有 7 个表

另一个奇怪的事情是我的

Promise.all

显然解析得很好,尽管我的代码在解析或拒绝语句之前从未执行console.log。

失败的代码:

export function clearAllData() { const promiseArray : Promise<void>[] = []; // avoid foreign key constraint failures const tableNamesReverse = [...Object.values(TABLE_NAMES)].reverse(); for (const tableName of tableNamesReverse) { promiseArray.push( new Promise((resolve, reject) => { database.transaction((tx) => { console.log(`DELETE FROM ${tableName}`) tx.executeSql( `DELETE FROM ${tableName}`, [], (_, result) => { console.log(`Deleted table ${tableName}`) resolve(); }, (_, err) => { console.log(err); reject(); return true; } ); }); }) ) } return Promise.all(promiseArray); }
我在控制台中得到的所有内容:

LOG clearing all data! // StackOverlow NOTE: This is from the line that calls the above method LOG DELETE FROM migrations
我也尝试将其简化为仅在上述函数中等待一个 Promise,如下所示,但它仍然无法到达成功回调或失败回调:

export async function clearAllData() { await new Promise<void>((resolve, reject) => { database.transaction((tx) => { tx.executeSql( `DELETE FROM ${TABLE_NAMES.Migrations}`, [], (_, result) => { console.log(`Deleted table ${TABLE_NAMES.Migrations}`) resolve(); }, (_, err) => { console.log(err); reject(); return true; } ); }); }); return; }
    
android sql react-native sqlite expo
1个回答
0
投票
我的 Expo 应用程序中也遇到同样的问题。 在 iOS 中工作正常,但编译后的 Android 代码会挂在“从表名中删除”命令上。 没有错误。 就停下来了。

我刚刚升级到 Expo 50,expo-sqlite 版本为 13.4.0。

© www.soinside.com 2019 - 2024. All rights reserved.