Expo SQLite插入数据后无法获取新数据,仅刷新APP可见
问题分析与解决方案
问题根源
你的getOrders是一个预先创建好的Promise实例,模块加载时就执行了一次数据库查询并缓存了结果。之后无论调用多少次getOrders,它都会返回同一个已完成的Promise,自然只能拿到初始的旧数据,只有重启APP重新加载模块时才会重新执行查询。
另外setOrder没有处理异步完成的回调,无法确保插入操作完成后再执行查询,也可能导致查询时机过早拿不到新数据。
修复代码
修改getOrders为函数,每次调用都发起新的查询;同时给setOrder添加Promise支持,确保插入完成后再获取数据:
import * as SQLite from "expo-sqlite"; function openDatabase() { const db = SQLite.openDatabase("db.db"); return db; } const db = openDatabase(); // Create table part export const createTable = async () => { return new Promise((resolve, reject) => { db.transaction((tx) => { tx.executeSql( "create table if not exists orders (id integer primary key not null, manager int, buyer int, sum int, date text, products text);", [], () => resolve({ message: "created tables" }), (_, error) => reject(error) ); }); }); }; // orders part // 改成函数,每次调用都执行新的查询 export const getOrders = () => { return new Promise(function(resolve, reject) { db.transaction((tx) => { tx.executeSql("select * from orders", [], (_, { rows }) => { // 将rows对象转为数组,方便后续处理 resolve(Array.from(rows._array)); }, (_, error) => reject(error)); }); }); }; // 改成返回Promise,确保插入完成后再进行后续操作 export const setOrder = (workerId, consumerId, sum, date, products) => { return new Promise((resolve, reject) => { db.transaction((tx) => { tx.executeSql( "insert into orders (manager, buyer, sum, date, products) values (?, ?, ?, ?, ?)", [workerId, consumerId, sum, date, products], (_, result) => resolve(result), (_, error) => reject(error) ); }); }); };
使用示例
在业务代码中,插入数据后等待完成,再调用getOrders()获取最新数据:
// 插入订单后获取最新列表 async function addAndGetOrders() { try { await setOrder(1, 2, 100, "2024-05-20", JSON.stringify([{name: "product1"}])); const latestOrders = await getOrders(); console.log(latestOrders); // 这里就能拿到包含新数据的列表了 } catch (error) { console.error("操作失败:", error); } }
内容的提问来源于stack exchange,提问作者GameOverAgain
相关产品推荐
相关产品推荐

