如何使用 expo-sqlite 执行带有 typescript 的 sql?

Posted

技术标签:

【中文标题】如何使用 expo-sqlite 执行带有 typescript 的 sql?【英文标题】:how to use expo-sqlite execute sql with typescript? 【发布时间】:2021-06-09 17:47:27 【问题描述】:

大家好,我想使用 expo-sqlite 到事务对象来执行 sql 语句。

但是,我在定义错误函数的返回值时遇到了问题。

示例代码如下:

tx.executeSql(

    // sql statement (ok)
    "...",

    // input arguments (ok)
    [...],

    // success case: since I use it in a promise, so I use: resolve(...) (ok)
    () => 
          resolve()
        ,

    // failed case: I want to reject it, use reject()
    // But I got an Error here! (Wrong!!!)
    // Here ask me to return a boolean value, but how??? true or false???
    (_, err) => 
          reject(err) // not enough???
       
      )

从类型定义文件中,我知道,我需要为错误回调函数返回一个布尔值,但是哪个呢?是真是假???

你知道怎么做吗???

PS。这里是关于 expo-sqlite 的官方文档:https://docs.expo.io/versions/latest/sdk/sqlite/

【问题讨论】:

【参考方案1】:

我不知道为什么错误回调函数确实需要布尔返回类型。由于我们无论如何都解决/拒绝了承诺,我认为我们可以节省地忽略返回类型。

您可以在下面找到我的打字稿同步示例:

export const fetchTypeSaveSql = async <T>(sqlStatement: string, args: any[] | undefined): Promise<T[]> => 
    return new Promise((resolve) => 
        db.transaction(tx => 
            tx.executeSql(
                sqlStatement, args,
                (_, result) => 
                    resolve(Array.from(result.rows as any) as T[])
                ,
                (_, error): boolean => 
                    console.warn(error)
                    resolve([])
                    return false
                )
        )
    )

【讨论】:

为什么不返回true? 更新了答案【参考方案2】:

SQLStatementErrorCallback 的返回类型是boolean(而不是void),因为它用于指示是否处理了错误。

如果错误得到处理(即return true),整个事务不会失败。如果它没有被处理(即return false),那么它会被处理。 只有在您能够从错误中适当恢复时,您才应该return true

请记住,executeSql 仅在事务中使用(通过 db.transactiondb.readTransaction 创建)。事务接受它自己的成功和错误回调。

您可以通过从这里向后工作来检查源代码中的这个:https://github.com/nolanlawson/node-websql/blob/7b45bf108a9cffb1c7e16b9a7dfec47be8361850/lib/websql/WebSQLTransaction.js#L64-L68

if (batchTask.sqlErrorCallback(self, res.error)) 
  // user didn't handle the error
  self._error = res.error;
  return onDone();

【讨论】:

以上是关于如何使用 expo-sqlite 执行带有 typescript 的 sql?的主要内容,如果未能解决你的问题,请参考以下文章

expo-sqlite 返回 undefined 不是 excuteSql 函数中的对象

如何使用带有参数的python装饰器?

带有变量的laravel视图

一次推送多个对象

带有标志属性的 Enum.TryParse

带有标志属性的 Enum.TryParse