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

使用Expo SQLite无法获取数据库数据的技术求助

问题描述

在React Native应用中使用expo-sqlite搭建数据库,初始化函数dbInit能返回正常响应,但尝试获取programs表数据时仅收到「Possible Unhandled Promise Rejection」警告,无其他日志,插入操作也疑似失败。

dbInit响应信息

{
  "version": "1.0",
  "_db": {
    "_closed": false,
    "_name": "deep_config.db"
  },
  "_txnQueue": {
    "length": 0
  },
  "_running": false,
  "_currentTask": null
}

警告信息

LogBox.js:148 Possible Unhandled Promise Rejection (id: 0):
WebSQLTransaction {
  "_complete": true,
  "_error": null,
  "_running": false,
  "_runningTimeout": false,
  "_sqlQueue": Queue {
    "first": undefined,
    "last": undefined,
    "length": 0,
  },
  "_websqlDatabase": WebSQLDatabase {
    "_currentTask": null,
    "_db": SQLiteDatabase {
      "_closed": false,
      "_name": "deep_config.db",
    },
    "_running": false,
    "_txnQueue": Queue {
      "first": undefined,
      "last": undefined,
      "length": 0,
    },
    "closeAsync": [Function bound close],
    "deleteAsync": [Function bound deleteAsync],
    "exec": [Function bound exec],
    "version": "1.0",
  },
}

数据库相关代码

function openCB(db: any) {
    console.log("SQL executed");
    console.log(db);
}

const database = SQLite.openDatabase(
    "deep_config.db",
    "1.0",
    "Test Database",
    200000,
    openCB
);

export const dbInit: any = () => {
    const promise = new Promise((resolve, reject) => {
        database.transaction((tx) => {
            tx.executeSql(
                `CREATE TABLE IF NOT EXISTS programs (
            id INTEGER PRIMARY KEY NOT NULL,
            programName TEXT NOT NULL,
            daysOfWeek TEXT NOT NULL,
            startHours TEXT NOT NULL,
            startMinutes TEXT NOT NULL,
            workingHours TEXT NOT NULL,
            workingMinutes TEXT NOT NULL,
            triggerTime TEXT NOT NULL,
            cableDirection TEXT NOT NULL
            );`,
                [],
                (res) => {
                    resolve(res);
                },
                // @ts-ignore
                (err) => {
                    reject(err);
                }
            );
        });
    });
    return promise;
};


export const fetchPrograms = (id: "*" | number) => {
    const promise = new Promise((resolve, reject) => {
        database.transaction((tx) => {
            tx.executeSql(
                `SELECT * FROM programs WHERE id = ${id};`,
                [],
                (_, res) => {
                    resolve(res);
                },
                // @ts-ignore
                (err) => {
                    reject(err);
                }
            );
        });
    });
    return promise;
};

问题排查与修复方案

核心问题分析

  1. SQL语法错误:当fetchPrograms传入id="*"时,拼接后的SQL为SELECT * FROM programs WHERE id = *;,这是无效语法,直接导致查询失败;同时直接拼接参数存在SQL注入风险。
  2. 未处理Promise异常:调用fetchPrograms时未通过.catch()或try/catch捕获异常,引发「Possible Unhandled Promise Rejection」警告。
  3. 回调参数错误:dbInit中tx.executeSql的成功回调错误地将事务对象作为结果返回,而非实际的建表结果。

修复后的代码

function openCB(db: any) {
    console.log("SQL executed");
    console.log(db);
}

const database = SQLite.openDatabase(
    "deep_config.db",
    "1.0",
    "Test Database",
    200000,
    openCB
);

export const dbInit: any = () => {
    return new Promise((resolve, reject) => {
        database.transaction((tx) => {
            tx.executeSql(
                `CREATE TABLE IF NOT EXISTS programs (
                    id INTEGER PRIMARY KEY NOT NULL,
                    programName TEXT NOT NULL,
                    daysOfWeek TEXT NOT NULL,
                    startHours TEXT NOT NULL,
                    startMinutes TEXT NOT NULL,
                    workingHours TEXT NOT NULL,
                    workingMinutes TEXT NOT NULL,
                    triggerTime TEXT NOT NULL,
                    cableDirection TEXT NOT NULL
                );`,
                [],
                // 正确获取结果对象(第二个参数)
                (_, res) => {
                    resolve(res);
                },
                (_, err) => {
                    reject(err);
                    // 返回true终止事务传播
                    return true;
                }
            );
        });
    });
};


export const fetchPrograms = (id: "*" | number) => {
    return new Promise((resolve, reject) => {
        database.transaction((tx) => {
            let sql = "";
            let params: any[] = [];
            // 根据id类型构建合法SQL与参数
            if (id === "*") {
                sql = "SELECT * FROM programs;";
            } else {
                sql = "SELECT * FROM programs WHERE id = ?;";
                params = [id];
            }
            tx.executeSql(
                sql,
                params,
                (_, res) => {
                    resolve(res);
                },
                (_, err) => {
                    reject(err);
                    return true;
                }
            );
        });
    });
};

正确使用示例(需捕获异常)

// 查询所有programs
fetchPrograms("*")
    .then(res => {
        console.log("查询结果:", res.rows._array);
    })
    .catch(err => {
        console.error("查询失败:", err);
    });

// 查询单个program
fetchPrograms(1)
    .then(res => {
        console.log("单个结果:", res.rows._array[0]);
    })
    .catch(err => {
        console.error("查询失败:", err);
    });

内容的提问来源于stack exchange,提问作者Eren Talan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:43:20