You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 18:52:46