带有 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.execbegin transaction/commit/rollback SQL 语句。您需要单独的连接进行交易。为此,我使用自己的wrapper

【讨论】:

我对 sqlite 有一些问题,我创建了 insert fetch delete 函数,但由于某种原因它对我不起作用。你能帮我吗?

以上是关于带有 React Native 错误的 SQLite 'table xxxx has no column yyyy'的主要内容,如果未能解决你的问题,请参考以下文章

带有导航的 React-native ListView

带有 redux 的 React-Native-Navigation V2 无法传递道具

在带有 typescript 的 react-native 中使用 createRef?

带有 Nextjs 和 React-native 的 monorepo 中的 Nohoist:无法解决反应

我无法在带有 redux 的 react-native 中使用地理定位

带有 React-Native 的 android 模拟器上的位置请求超时