React Native中SQLite启动时仅创建单表,求双表创建解决方案
解决方法
问题根源
- 你每次调用
SQLiteService()都会生成全新的服务实例,虽然逻辑上不影响,但属于冗余操作; - SQL语句中用单引号包裹列名(
'key')是错误的——单引号在SQL中表示字符串字面量,而非列标识符,key作为SQLite保留字,必须用反引号转义; - 未使用事务管理多表创建,可能因连续执行时的隐式错误导致部分操作失败。
步骤1:修正SQL语句(SqliteService.tsx)
将列名的单引号替换为反引号,避免语法解析错误:
import { enablePromise, openDatabase } from 'react-native-sqlite-storage' const SQLiteService = () => { const getDBConnection = async () => { enablePromise(true) return openDatabase({ name: 'test.db', location: 'default' }) } // 修正列名的转义方式 const createTable1 = async (db) => { const query = `CREATE TABLE IF NOT EXISTS TABLE_1 (\`key\` TEXT NOT NULL, \`value\` TEXT NOT NULL);` await db.executeSql(query) } const createTable2 = async (db) => { const query = `CREATE TABLE IF NOT EXISTS TABLE_2 (\`key\` TEXT NOT NULL, \`value\` TEXT NOT NULL);` await db.executeSql(query) } // 新增批量创建方法(用事务保证原子性) const createAllTables = async (db) => { await db.transaction(async (tx) => { await tx.executeSql(createTable1.toString().match(/`CREATE.*;/)[0]) await tx.executeSql(createTable2.toString().match(/`CREATE.*;/)[0]) }) } return { getDBConnection, createTable1, createTable2, createAllTables } }
步骤2:优化数据库初始化逻辑(App.tsx)
复用同一个SQLiteService实例,避免冗余创建,并使用批量创建方法:
const setupDatabase = useCallback(async () => { // 只创建一次服务实例 const sqliteService = SQLiteService() const db = await sqliteService.getDBConnection() // 用事务批量创建表 await sqliteService.createAllTables(db) // 操作完成后关闭连接(按需选择) await db.close() }, []) useEffect(() => { setupDatabase() }, [setupDatabase])
替代方案(不新增批量方法)
如果不想修改SqliteService,只需调整App.tsx的实例复用逻辑即可:
const setupDatabase = useCallback(async () => { const sqliteService = SQLiteService() const db = await sqliteService.getDBConnection() // 使用同一个实例的方法 await sqliteService.createTable1(db) await sqliteService.createTable2(db) await db.close() }, [])
内容的提问来源于stack exchange,提问作者paperskyline
相关产品推荐
相关产品推荐

