Expo SQLite 数据库未在本机反应中初始化

Expo SQLite Database isn't initialising in react native

我正在尝试使用 expo 的 SQLite 为我的 React 本机应用程序创建数据库并遵循其文档,但我认为数据库没有初始化。

文档:expo-sqlite

App.js:

console.log("init () above");

init()
  .then(() => {
    console.log("DATABASE INITIALIZED");
  })
  .catch(() => {
    console.log("FAILED DATABSE INITIALIZATION", err);
  });

console.log("init () below");

//Nothing logs in console

控制台:

init () above
init () below
places: Array []

我将 promise 创建为 init(),如果它失败 returns 就会出错,当它解决时它会记录一条成功消息 DATABASE INITIALIZED。但是我没有得到任何输出。

helper/db:

import * as SQLite from "expo-sqlite";

const db = SQLite.openDatabase("places.db");

export const init = () => {
  const promiseDB = new Promise((resolve, reject) => {
    db.transaction((tx) => {
      tx.executeSql(
        "CREATE TABLE PLACES IF NOT EXISTS places (id INTEGER PRIMARY KEY NOT NULL, title TEXT NOT NULL, imageUri TEXT NOT NULL, address TEXT NOT NULL, lat REAL NOT NULL, lng REAL NOT NULL)"
      );
      [],
        () => {
          resolve();
        },
        (_, err) => {
          reject(err);
        };
    });
  });
  return promiseDB;
};


我没有收到任何错误,控制台中也没有成功消息。我不知道问题出在哪里,我做错了什么?

你没有正确编写你的函数,你忘记了大括号并在你不应该有的地方添加和清空了参数数组。

您还在查询中写了 CREATE TABLE PLACES IF NOT EXISTS places。它认为正确的语法是 CREATE TABLE IF NOT EXISTS places.

事务中的参数顺序为callback、errorCallback、successCallback。 https://docs.expo.dev/versions/latest/sdk/sqlite/#database

executeSql中参数的顺序是sqlStatement、arguments、callback、errorCallback。 https://docs.expo.dev/versions/latest/sdk/sqlite/#sqltransaction

这应该创建您的 table:

return new Promise((resolve, reject) => {
        db.transaction(
            function (tx) {
                tx.executeSql("CREATE TABLE IF NOT EXISTS places (id INTEGER PRIMARY KEY NOT NULL, title TEXT NOT NULL, imageUri TEXT NOT NULL, address TEXT NOT NULL, lat REAL NOT NULL, lng REAL NOT NULL)");
            },
            function (error) {
                reject(error.message);
            },
            function () {
                resolve(true);
                console.log('Created database OK');
            }
      );
});

需要添加参数的例子:

return new Promise((resolve, reject) => {
    db.transaction(
        function (tx) {
            tx.executeSql(
                'SELECT * FROM TABLE_NAME WHERE name=?;',
                [name],
                function (tx, resultSet) {
                    let data = [];
                    for (let i = 0, c = resultSet.rows.length;i < c;i++) {
                        data.push(resultSet.rows.item(i));
                    }
                    resolve(data);
                },
                function (tx, error) {
                    reject(error.message);
                }
            );
        },
        function (error) {
            reject(error.message);
        }
    );
});