程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如果查询已在应用程序启动时执行,则无法在 React Native (Expo) 中运行 SQLite 查询大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如果查询已在应用程序启动时执行,则无法在 React Native (Expo) 中运行 sqlite 查询?

开发过程中遇到如果查询已在应用程序启动时执行,则无法在 React Native (Expo) 中运行 sqlite 查询的问题如何解决?下面主要结合日常开发的经验,给出你关于如果查询已在应用程序启动时执行,则无法在 React Native (Expo) 中运行 sqlite 查询的解决方法建议,希望对你解决如果查询已在应用程序启动时执行,则无法在 React Native (Expo) 中运行 sqlite 查询有所启发或帮助;

我想了解为什么我的应用(React Native with Expo)会出现这个问题,该应用应该搜索大学课程。@H_301_1@

基本上,我使用的是预先填充的 SQLite 数据库(大约 4000 条记录),其中包含诸如班级名称、教授、校园、会话、学期等字段。@H_301_1@

当应用程序启动时,它从资产中加载数据库,并使用 useEffect 运行查询,其中我从默认术语(在本例中为夏季)获取包含所有数据的数组。这个数组用于填充一个平面列表,我可以使用搜索栏进行查询。我还有一个带有一些单选按钮的抽屉菜单,我用来设置过滤器(例如更改学校课程、校园和学期)。@H_301_1@

每个单选按钮都会更改一个变量的状态(使用 redux-toolkit),我用它来更改查询(这些变量具有默认值,因为我需要在启动时使用查询填充平面列表)。@H_301_1@

这是查询:@H_301_1@

`SELECT * FROM ${termArgs} WHERE session ${sessionArgs} AND campus ${CampusArgs};`

在启动时运行查询的 useEffect 应该在每次变量的状态(termArgs、sessionArgs、campusArgs)发生变化时再次运行,如下所示:@H_301_1@

  useEffect(() => {
    runQuerIEs();
  },[termArgs,sessionArgs,campusArgs]);

我的问题是,如果此查询在启动时运行并且我单击其中一个单选按钮来更改查询,则会在 console.log 上收到此错误:“[错误:错误代码 10:磁盘 I/O 错误]” ,这使我无法更新查询。@H_301_1@

但是,如果我不使用 useEffect 在启动时运行查询,并且将查询函数与我的函数一起添加以更改变量的状态,我可以单击按钮并运行查询(使用新状态) 多次。@H_301_1@

出于某种原因,只要我在启动时不自动运行查询,只要我通过单击按钮触发该功能,事情就可以正常工作。因此,我使用的临时解决方法是,在启动时我没有使用 useEffect 来运行第一个查询,而是在启动时有一个带有“Ok”按钮的“欢迎”警报按钮,当用户单击它时,就会运行查询。并且要在用户单击按钮时运行查询,我具有与之前相同的 useEffect,但条件仅在用户单击按钮以切换过滤器抽屉后才运行(我添加了一个 canquery=true 到切换按钮以及打开的抽屉)。这是有效的,但感觉就像一个黑客,我希望我可以在没有“欢迎”警报的情况下在启动时运行查询。有谁知道这可能是什么原因造成的?@H_301_1@

TLDR:我可以使用带有函数的 onclick 事件运行查询函数,只要原始查询在启动时没有使用 useEffect 运行,否则它将无法工作。@H_301_1@

我正在使用的一些代码:@H_301_1@

函数使用资产中预先填充的 SQLite 数据库:@H_301_1@

async function openDatabase() {
    if (
      !(await fileSystem.geTinfoAsync(fileSystem.documentDirectory + "sqlite"))
        .exists
    ) {
      await fileSystem.makeDirectoryAsync(
        fileSystem.documentDirectory + "sqlite"
      );
    }

    await fileSystem.downloadAsync(
      Asset.fromModule(require("./assets/database.db")).uri,fileSystem.documentDirectory + "sqlite/database.db"
    );
    return sqlite.openDatabase("database.db");
  }

随着@H_301_1@

 useEffect(() => {
    openDatabase();
  },[]);

这是我的查询函数:@H_301_1@

 const db = sqlite.openDatabase("database.db");

 const runQuerIEs = () => {
     db.transaction( tx => {
       tx.executesql(
        `SELECT * FROM ${termArgs} WHERE session ${sessionArgs} AND campus ${CampusArgs};`,[],(tx,{ rows: { _array } }) => {
          setData(_array); // data is used for the flatList
          setFullData(_array); // to Help with the search bar querIEs
        },(_,error)=> {
          console.log('Error: ',error);
        }
      );
    });
  };

当我单击单选按钮并且它们的状态发生变化时,我使用 useEffect 来触发 runquerIEs() 函数:@H_301_1@

  useEffect(() => {
    if (canquery) { // canquery is false until the user clicks on the filters toggle button
      runQuerIEs();
    }
  },campusArgs]);

按钮功能(简化)@H_301_1@

<Radiobutton onPress={() => {
              setSession(item)
            }}
          >
            {item.namE}
</Radiobutton>

警报按钮@H_301_1@

  useEffect(() => {
    Alert.alert(
      "Welcome to Class Search","",[
        {
          text: "Ok",onPress: () => runQuerIEs(),},],{ cancelable: false }
    );
  },[]);

谢谢@H_301_1@

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

大佬总结

以上是大佬教程为你收集整理的如果查询已在应用程序启动时执行,则无法在 React Native (Expo) 中运行 SQLite 查询全部内容,希望文章能够帮你解决如果查询已在应用程序启动时执行,则无法在 React Native (Expo) 中运行 SQLite 查询所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。