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
相关产品推荐
相关产品推荐

