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

React Native/Expo中tx.executeSql()无响应无日志问题求助

问题:React Native中SQLite的tx.executeSql无响应,不输出成功/错误日志

我在React Native里用SQLite做消息存储,所有tx.executeSql()都没反应——既不打印成功日志,也不输出错误信息,就像这段代码根本没执行一样。我需要让SQLite正常工作,实现消息的存储功能。

我的代码

useEffect(() => {
    // 表创建
    Chat_DB.transaction((tx) => {
        tx.executeSql(
            `create table if not exists ${RoomName} (id text primary key not null, date text, sender text, receiver text, peer_key_hash text, server_key_hash text, encrypt_AES_Key text, encrypt_data blob);`,
            null,
            (tx, result) => {
                console.log('表创建成功:', result);
            },
            (tx, err) => {
                console.log('表创建失败:', err);
                return false; // 回滚
            }
        );
        console.log("表创建");
    });
    
    Chat_DB.transaction((tx) => {
        tx.executeSql(
            `INSERT INTO ${RoomName} (id, date, sender, receiver, peer_key_hash, server_key_hash, encrypt_AES_Key, encrypt_data) VALUES ('1', '0', '2', null, null, null, null, 'Hello!');`,
            null,
            (tx, result) => {
                console.log('数据插入成功:', result);
            },
            (tx, err) => {
                console.log('数据插入失败:', err);
                return false; // 回滚
            }
        );
        console.log("初始数据插入");
    });

    Chat_DB.transaction((tx) => {
        tx.executeSql(`SELECT * FROM ${RoomName};`, [], (_, { rows }) => {
            console.log('全部数据:', rows);
            for (let i = 0; i < rows.length; i++) {
                console.log(`Row ${i + 1}:`, rows.item(i));
            }
        });
        console.log("初始数据输出");
    });

    fetchMessages(); // 执行函数
}, []); // 组件挂载时仅执行一次

日志信息

LOG 表创建
Android Bundling complete 509ms
LOG 表创建
› 重新加载应用
Android Bundling complete 218ms
LOG 表创建
LOG 表创建
› 重新加载应用
Android Bundling complete 129ms
LOG 表创建


排查与解决步骤

1. 先确认数据库初始化是否正确

不管用的是react-native-sqlite-storage还是其他SQLite库,先检查Chat_DB实例是否成功创建。如果数据库连接失败,后续所有操作都不会触发回调:

import SQLite from 'react-native-sqlite-storage';

// 初始化数据库示例
const Chat_DB = SQLite.openDatabase(
  {
    name: 'ChatDB.db',
    location: 'default'
  },
  () => console.log('数据库连接成功'),
  (err) => console.log('数据库连接失败:', err)
);

如果打印出连接失败的日志,先解决数据库初始化问题。

2. 检查RoomName变量的合法性

${RoomName}作为表名必须符合SQL规则:

  • 不能包含空格、特殊字符(下划线除外)
  • 不能是SQL关键字(比如user、table)
  • 先把RoomName硬编码成固定值(比如test_chat_room)测试,排除变量值的问题。

3. 修正transaction的回调与参数

你的代码里同步打印的"表创建"日志会先于异步的executeSql回调执行,不能作为操作成功的依据。另外,executeSql的第二个参数建议用空数组[]代替null,避免部分库的兼容问题:

Chat_DB.transaction(
  (tx) => {
    tx.executeSql(
      `create table if not exists test_chat_room (id text primary key not null, date text, sender text, receiver text, peer_key_hash text, server_key_hash text, encrypt_AES_Key text, encrypt_data blob);`,
      [],
      (tx, result) => console.log('表创建成功:', result),
      (tx, err) => {
        console.log('表创建失败:', err);
        return false;
      }
    );
  },
  (err) => console.log('事务全局错误:', err), // 新增事务全局错误回调
  () => console.log('事务执行完成') // 新增事务成功完成回调
);

4. 合并事务提升可靠性

把创建表、插入数据、查询合并到同一个事务里,减少异步冲突,保证操作原子性:

useEffect(() => {
  Chat_DB.transaction(
    (tx) => {
      // 创建表
      tx.executeSql(
        `create table if not exists test_chat_room (id text primary key not null, date text, sender text, receiver text, peer_key_hash text, server_key_hash text, encrypt_AES_Key text, encrypt_data blob);`,
        [],
        () => console.log('表创建语句执行成功'),
        (tx, err) => {
          console.log('表创建失败:', err);
          return false;
        }
      );
      // 插入初始数据
      tx.executeSql(
        `INSERT INTO test_chat_room (id, date, sender, receiver, peer_key_hash, server_key_hash, encrypt_AES_Key, encrypt_data) VALUES ('1', '0', '2', null, null, null, null, 'Hello!');`,
        [],
        () => console.log('数据插入语句执行成功'),
        (tx, err) => {
          console.log('数据插入失败:', err);
          return false;
        }
      );
      // 查询数据
      tx.executeSql(
        `SELECT * FROM test_chat_room;`,
        [],
        (_, { rows }) => {
          console.log('全部数据:', rows);
          for (let i = 0; i < rows.length; i++) {
            console.log(`第${i + 1}行数据:`, rows.item(i));
          }
        },
        (tx, err) => {
          console.log('查询失败:', err);
          return false;
        }
      );
    },
    (err) => console.log('事务失败:', err),
    () => {
      console.log('所有操作完成');
      fetchMessages();
    }
  );
}, []);

5. 测试基础SQL语句验证库功能

先执行最简单的SQL语句测试,确认库本身能正常工作:

tx.executeSql('SELECT 1+1 AS result;', [], (_, { rows }) => {
  console.log('测试结果:', rows.item(0).result);
});

如果这个都没回调,说明SQLite库和RN版本不兼容,或者依赖安装有问题,重新安装库并检查版本匹配性。

6. 检查平台权限配置

  • Android:确保AndroidManifest.xml中添加了必要的存储权限(针对Android 11及以下版本)
  • iOS:确认Info.plist中没有限制文件访问的配置,默认数据库存储路径是允许访问的

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 05:13:12