react-native sqlite仅第一次运行

9wbgstp7  于 2023-01-13  发布在  SQLite
关注(0)|答案(1)|浏览(106)

我尝试在应用程序启动时创建两个表。但由于某种原因,只创建了一个表。如果我尝试一次创建其中一个表,它工作正常。到目前为止,我可以知道的是,这两个查询都是有效的,它们应该工作,因为我尝试在关闭应用程序并再次启动并创建另一个表后逐个创建这两个表。但是我希望在应用程序启动时创建这两个表。
SqliteService.tsx

import { enablePromise, openDatabase } from 'react-native-sqlite-storage'

const SQLiteService = () => {
  const getDBConnection = async () => {
    enablePromise(true)
    return openDatabase({ name: 'test.db', location: 'default' })
  }
  const createTable1 = async (db) => {
    const query = `CREATE TABLE IF NOT EXISTS TABLE_1 ('key' TEXT NOT NULL, 'value' TEXT NOT NULL);`
    await db.executeSql(query)
  }
  const createTable2 = async (db) => {
    const query = `CREATE TABLE IF NOT EXISTS TABLE_2 ('key' TEXT NOT NULL, 'value' TEXT NOT NULL);`
    await db.executeSql(query)
  }
  return {
    getDBConnection,
    createTable1,
    createTable2
  }
}

在我的应用程序中

const setupDatabase = useCallback(async () => {
  const db = await SQLiteService().getDBConnection()
  await SQLiteService().createTable1(db) // only this gets created
  await SQLiteService().createTable2(db)
}, [])

useEffect(() => {
  setupDatabase()
}, [setupDatabase])

任何关于如何解决这个问题的帮助都是很好的。谢谢。

j8yoct9x

j8yoct9x1#

只是回答我自己的问题。这可能不是最好的方法,但我能够解决这个问题。我必须创建多个承诺,并使用Promise.all()await解决所有承诺,以便先创建表,然后再访问/插入数据
SqliteService.tsx

import { enablePromise, openDatabase } from 'react-native-sqlite-storage'

const SQLiteService = () => {
  const getDBConnection = async () => {
    return openDatabase({ name: 'test.db', location: 'default' })
  }
  const initializeDatabases = async (db) => {
    enablePromise(true)
    const table1Query = `CREATE TABLE IF NOT EXISTS TABLE_1 ('key' TEXT NOT NULL, 'VALUE' TEXT NOT NULL);`
    const table2Query = `CREATE TABLE IF NOT EXISTS TABLE_2 ('KEY' TEXT NOT NULL, 'value' TEXT NOT NULL);`
    const a = new Promise((resolve, reject) => {
      db.executeSql(table1Query, [], (rs) => resolve(rs), reject)
    })
    const b = new Promise((resolve, reject) => {
      db.executeSql(table2Query, [], (rs) => resolve(rs), reject)
    })
    const data = await Promise.all([a, b])
    return data
  }
  return {
    getDBConnection,
    initializeDatabases
  }
}

App.tsx

const setupDatabase = useCallback(async () => {
  const db = await SQLiteService().getDBConnection()
  SQLiteService().initializeDatabases(db)
}, [])

useEffect(() => {
  setupDatabase()
}, [setupDatabase])

我对enablePromise(true)的用法还不是很清楚,如果有人有更好的解决方案,请随时回答这个问题

相关问题