【问题标题】:Unhandled promise rejection: Error: Database Table error: undefined in react native未处理的承诺拒绝:错误:数据库表错误:本机反应中未定义
【发布时间】:2022-01-27 23:38:12
【问题描述】:

我正在尝试使用 expo 的 SQLite 存储我为我的 react 本机应用程序创建的数据,但是当我尝试这样做时出现错误。

我的代码:

const savePlaceHandler = async () => {
    try {
      const newPath = await fileMoveHandler();
      const dbResult = await insertData(
        titleValue,
        newPath,
        "Dummy address",
        15.2,
        16.2
      ); //Here I am trying to store data in SQLite
      console.log("dbResult: ", dbResult); //no logs
      dispatch(placesActions.addPlace(titleValue, newPath)); //it doesn't dispatch
      props.navigation.goBack();
    } catch (err) {
      console.log(err);
      throw err;
    }
  };


从上面我正在尝试将数据存储在数据库中。

export const insertData = (title, imageUri, address, lat, lng) => {
  const promiseDB = new Promise((resolve, reject) => {
    db.transaction((tx) => {
      tx.executeSql(
        `INSERT INTO places (title, imageUri ,address, lat, lng) VALUES (?,?,?,?,?)`,
        [title, imageUri, address, lat, lng],
        (error) => {
          reject(error);
          console.log(error);
          throw new Error("Database Table error: " + error.message); //Error
        },
        (result) => {
          resolve(result);
          console.log("result: ", result);
        }
      );
    });
  });
  return promiseDB;
};

从上面的代码中,每当我将数据从savePlaceHandler 发送到insertData 时,都会出现错误。

错误:

[Unhandled promise rejection: Error: Database Table error: undefined]
* helper/db.js:34:22 in tx.executeSql$argument_2
- node_modules/@expo/websql/lib/websql/WebSQLTransaction.js:69:13 in self._websqlDatabase._db.exec$argument_2
- node_modules/expo-sqlite/build/SQLite.js:16:8 in SQLiteDatabase#exec
- node_modules/react-native/node_modules/promise/setimmediate/core.js:37:13 in tryCallOne
- node_modules/react-native/node_modules/promise/setimmediate/core.js:123:24 in setImmediate$argument_0
- node_modules/react-native/Libraries/Core/Timers/JSTimers.js:130:14 in _callTimer
- node_modules/react-native/Libraries/Core/Timers/JSTimers.js:181:14 in _callImmediatesPass
- node_modules/react-native/Libraries/Core/Timers/JSTimers.js:441:30 in callImmediates
- node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:387:6 in __callImmediates
- node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:135:6 in __guard$argument_0
- node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:364:10 in __guard
- node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:134:4 in flushedQueue
* [native code]:null in flushedQueue
* [native code]:null in invokeCallbackAndReturnFlushedQueue

Possible Unhandled Promise Rejection (id: 1):
WebSQLTransaction {
  "_complete": false,
  "_error": null,
  "_running": true,
  "_runningTimeout": false,
  "_sqlQueue": Queue {
    "first": undefined,
    "last": undefined,
    "length": 0,
  },
  "_websqlDatabase": WebSQLDatabase {
    "_currentTask": TransactionTask {
      "errorCallback": [Function anonymous],
      "readOnly": false,
      "successCallback": [Function anonymous],
      "txnCallback": [Function anonymous],
    },
    "_db": SQLiteDatabase {
      "_closed": false,
      "_name": "places.db",
    },
    "_running": true,
    "_txnQueue": Queue {
      "first": undefined,
      "last": undefined,
      "length": 0,
    },
    "exec": [Function anonymous],
    "version": "1.0",
  },
}

我无法弄清楚这个错误是什么意思 为什么我得到这个?

【问题讨论】:

  • 我看不到你的确切依赖关系,但你能确认它在哪里说你的executeSql 应该采用 4 个参数吗?我能看到的所有文档最多有 3 个格式为executeSql('query_string', [param array], (tx, result) => {...callback..})
  • 这里,在文档中,提到它们可以是executeSql()的4个参数(sqlStatement, args, callback, errorCallback) => voiddocs.expo.dev/versions/latest/sdk/sqlite/#sqltransaction
  • 很公平,但这意味着您已经交换了callbackerror callback... 的顺序,并且两个回调都采用2 个参数。首先始终是事务,然后分别是 ResultSet 对象和 Error 对象。

标签: javascript reactjs react-native sqlite promise


【解决方案1】:

根据提供的文档https://docs.expo.dev/versions/latest/sdk/sqlite/#sqltransaction,将回调实现的顺序交换为Transaction.executeSql

export const insertData = (title, imageUri, address, lat, lng) => {
  const promiseDB = new Promise((resolve, reject) => {
    db.transaction((tx) => {
      tx.executeSql(
        'INSERT INTO places (title, imageUri ,address, lat, lng) VALUES (?,?,?,?,?)',
        [title, imageUri, address, lat, lng],
        (tx, result) => {
          resolve(result);
        },
        (tx, error) => {
          reject(error);
        }
      );
    });
  });
  return promiseDB;
};

【讨论】:

  • 哦。好的。我做错了。感谢您的帮助。
猜你喜欢
  • 2019-02-09
  • 1970-01-01
  • 2019-10-27
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多