xirururu
xirururu

Reputation: 5508

how to use expo-sqlite execute sql with typescript?

Hi all I want to use expo-sqlite to transaction object to execute an sql statement.

However, I got a problem in define the return value of the error function.

Here is the example code:

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???
       }
      )

From the type definition file, I know, I need to return a boolean value for the error callback function, but which one? true or false???

Do you have some idea how to do it???

PS. Here is official doc about the expo-sqlite: https://docs.expo.io/versions/latest/sdk/sqlite/

Upvotes: 2

Views: 2057

Answers (2)

Josh
Josh

Reputation: 1281

The return type of SQLStatementErrorCallback is boolean (and not void) because it's used to indicate whether the error was handled or not.

If the error is handled (ie return true), the whole transaction doesn't fail. If it's not handled (ie return false), then it does. You should only return true if you've been able to suitably recover from the error.

Remember that executeSql is only used within a transaction (which is created via db.transaction or db.readTransaction). A transaction accepts it's own success and error callbacks.

You can check the this in the source code by working backwards from this: 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();
}

Upvotes: 0

mleister
mleister

Reputation: 2565

I don't know why the error callback function does need a return type of boolean. Since we resolve/reject the promise anyways I think we can savely ignore the return type.

Below you can find my typescript synchronous example:

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
                })
        })
    })
}

Upvotes: 3

Related Questions