我有一个用于 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;
}
我刚刚升级到 Expo 50,expo-sqlite 版本为 13.4.0。