带有 React Native 错误的 SQLite 'table xxxx has no column yyyy'
Posted
技术标签:
【中文标题】带有 React Native 错误的 SQLite \'table xxxx has no column yyyy\'【英文标题】:SQLite with React Native error 'table xxxx has no column yyyy'带有 React Native 错误的 SQLite 'table xxxx has no column yyyy' 【发布时间】:2020-10-23 14:04:47 【问题描述】:我在 React Native 中测试 SQLite,我使用的是 expo,所以我使用的包是 expo-sqlite,所以这是我的代码,非常简单,因为是为了测试:
import React from 'react'
import StyleSheet, Text, View from 'react-native'
import * as SQLite from 'expo-sqlite'
const db = SQLite.openDatabase('test')
export default function App()
testDB()
return (
<View style=styles.container>
<Text>Wello Horld!</Text>
</View>
)
async function testDB()
await db.transaction(async tx =>
console.log('on transaction')
await tx.executeSql(
'create table if not exists tasks (id integer primary key autoincrement, content text );',
[],
(tx, result) => console.log('result on create: ', result),
(tx, err) => console.log('error on create:', err)
)
await tx.executeSql(
'insert into tasks (content) values (?)',
['testing'],
(tx, result) => console.log('result on insert: ', result),
(tx, err) => console.log('error on insert: ', err)
)
await tx.executeSql(
'select * from tasks',
[],
(tx, result) => console.log('result on select: ', result),
(tx, err) => console.log('error on select: ', error)
)
)
输出:
result on create: WebSQLResultSet
"insertId": 0,
"rows": WebSQLRows
"_array": Array [],
"length": 0,
,
"rowsAffected": 0,
error on insert: [Error: table tasks has no column named content (code 1 SQLITE_ERROR): ,
while compiling: insert into tasks (content) values (?)]
result on select: WebSQLResultSet
"insertId": undefined,
"rows": WebSQLRows
"_array": Array [],
"length": 0,
,
"rowsAffected": 0,
为什么在调用第一个 executeSQL 方法时没有创建列?我看过一些例子,创建表格的方式总是一样的。
【问题讨论】:
表tasks
的早期版本是否存在没有列content
?
不,这就是所有代码,我要试试包装器
【参考方案1】:
不幸的是,db.transaction
不像大多数程序员期望的那样工作 - 它不支持传递 async
函数或返回承诺或类似的函数,tx.executeSql
只是 "Enqueues a SQL statement to execute in the transaction"。
带有一些主题信息的相关链接:https://github.com/expo/expo/issues/1889、https://github.com/expo/expo/issues/3726、https://forums.expo.io/t/are-expo-sqlite-transactions-sync-or-async/7934/5
为了利用事务,您可以使用db.exec
和begin transaction
/commit
/rollback
SQL 语句。您需要单独的连接进行交易。为此,我使用自己的wrapper
【讨论】:
我对 sqlite 有一些问题,我创建了 insert fetch delete 函数,但由于某种原因它对我不起作用。你能帮我吗?以上是关于带有 React Native 错误的 SQLite 'table xxxx has no column yyyy'的主要内容,如果未能解决你的问题,请参考以下文章
带有 redux 的 React-Native-Navigation V2 无法传递道具
在带有 typescript 的 react-native 中使用 createRef?
带有 Nextjs 和 React-native 的 monorepo 中的 Nohoist:无法解决反应