当前位置: 首页 > 知识库问答 >
问题:

react-native-sqlite-storage中的React本机异步等待

丌官信厚
2023-03-14

我不是新来的土生土长的。在开始之前,我已经通过了很多教程。我正在尝试在我的应用程序中建立商店,当需要时可以通过应用程序的屏幕访问。

这是我的文件结构。

  1. index.ios.js
  2. /app/index.js
  3. /app/store/database.js
  4. /app/store/userstore.js

index.ios.js

import { AppRegistry } from 'react-native';
import App from './app/index';
AppRegistry.registerComponent('AwesomeProject', () => App);

/app/index.js

import React, { Component} from 'react';
import {
  Text,
  View,
} from 'react-native';
import userStore from './store/userStore';
import ViewBackground from './components/ViewBackground';


class App extends Component {
        constructor(props){
            super(props);
            this.isLoggedIn = true;     
        }

        componentDidMount() {       
            this.fetchUsers().done();
        }

        async fetchUsers(){
            console.log('Before User Fetch');
            var result = await userStore.getAllUsers();
            console.log('After User Fetch');
        }

        render() {
            if(this.isLoggedIn){
                return this.loggedInView();
            }else{
                return this.loggedOutView();
            }
        }

        loggedInView(){
            return <ViewBackground>

            </ViewBackground>
        }

        loggedOutView(){
            return <View>
            <Text>Hi, This is logged Out view </Text>
            </View>
        }
    }

    export default App;

/app/store/userstore.js

从“React”导入React;从“./database”导入数据库;

    class UserStore{

        async getAllUsers(){
            let query = {
                type: 'SELECT',
                sql: 'SELECT * FROM Users',
                vals: [],
            }
            let queries = [query];
            console.log('in store before');
            let dbResult = await database.runQuery(queries);        
            console.log('in store after');
            return dbResult;        
        }
    }

    const userStore = new UserStore;

    export default userStore;

/app/store/database.js

    'use strict';
    import React from 'react';
    import SQLite from 'react-native-sqlite-storage';
    SQLite.enablePromise(true);

    var database_name = "test.db";
    var database_version = "1.0";
    var database_displayname = "Test";
    var database_size = 1024 * 1024 * 10;

    class Database  {

        constructor(){
            SQLite.openDatabase(database_name, database_version, database_displayname, database_size).then(this.dbOpenSuccess).catch(this.dbOpenError);
        }

        dbOpenSuccess(dbInstance){
            this.conn = dbInstance;
        }

        dbOpenError(err) {

        }

        getConnection() {
            return this.conn;
        }

        setUpDatabase(){
            let queries = [
            'CREATE TABLE IF NOT EXISTS Users (user_id INTEGER PRIMARY KEY, f_name VARCHAR(64), l_name VARCHAR(64), email_id VARCHAR(128), mobile VARCHAR(10))'
            ];
            this.conn.transaction( tx => {
                queries.map( q => {
                    tx.executeSql(q, [], res => {}, err => {});
                });
            });
        }

        async runQuery(queries) {
            await this.conn.transaction(tx => {
                return Promise.all(queries.map(async (q) => {
                    try {
                        let results = null;
                        switch(q.type){
                            case 'SELECT':                      
                            results = await tx.executeSql(q.sql, q.vals);
                            console.log('Query', q, 'Executed. results:', results);
                            break;
                        }

                    } catch(err) {
                        console.log('Something went wrong while executing query', q, 'error is', err);
                    }
                }));
            });
            return false;
        }

        closeDatabase(){
            this.conn.close().then(this.dbCloseSuccess).catch(this.dbCloseError);
        }

        dbCloseSuccess(res) {

        }

        dbCloseError(err){

        }
    }

    const dbInstance = new Database();

    dbInstance.setUpDatabase();

    export default dbInstance;

从代码中可以看到,在/app/index.js中,我试图从userstore.js中获取用户,它将最终调用database.js文件以从数据库中检索用户。当我试图从DB获取用户时,我想暂停代码的执行,所以我尝试使用Async/Await。

如果您可以在代码中看到,我使用了console.log()来检查执行是暂停还是继续。Async/Await在任何文件中都不起作用。在完成所有console.log之后,我会得到响应。

我想等待时间,直到我收到数据从数据库。请给一些专家建议,我哪里出了问题。提前道谢。

共有1个答案

尉迟卓
2023-03-14

您需要将其包装在Promise中,然后在sql执行完成时解析结果。

例如:

async () => {
  return new Promise((resolve, reject) => {
    db.transaction(tx => {
      tx.executeSql('SELECT * FROM users;', [], (tx, results) => {
        const { rows } = results;
        let users = [];

        for (let i = 0; i < rows.length; i++) {
          users.push({
            ...rows.item(i),
          });
        }

        resolve(users);

      });
    });
  });

}
 类似资料:
  • react-native-mmkv-storage An efficient, small & encrypted mobile key-value storage framework for React Native written in C++ using JSI What it is This library aims to provide a fast & reliable solutio

  • react-native-sqlite 是 React Native 上的一个 sqlite3 绑定,它可以打开数据库并让 SQL 查询运行其中。目前还只是早期版本, API 还有可能会改变。 示例代码: var sqlite = require('./react-native-sqlite');sqlite.open("filename.sqlite", function (error, dat

  • 今天,我使用“React-Native-Firebase”和“Native-Base”包创建了一个(空的)Android应用程序。它在调试模式下工作,但在释放模式下发生崩溃。 重现问题的步骤: > 创建新应用程序

  • 在此版本中使用了不推荐使用的Gradle功能,使其与Gradle 6.0不兼容。使用'--warning-mode all‘显示单个弃用警告。参见https://docs.gradle.org/5.5/userguide/command_line_interface.html#sec:command_line_warnings 26个可操作任务:2个已执行,24个最新 失败:生成失败,出现异常。

  • 但现在我正试图从yarn add@react native community/async storage添加异步存储,这给了我一个错误。它没有添加到我的项目中。 我在安装软件包时并没有收到任何错误,但它并没有添加到软件包中。json文件我还尝试添加本机基,然后运行react-native链接,该链接也没有添加到包中。json,它也给了我错误: > 警告包@react native communi

  • 问题内容: 我对后端非常熟悉。但是我遇到了一种情况,我必须在前端使用它。 我正在获取对象的数组,并且在那些对象中我获取了位置。现在,我可以获取单个地名,但是我想在map函数中使用该名称来获取地名。因此,正如我们所知道的那样,我必须在那边使用。 这是代码 但是,当我在此处将map函数与async一起使用时,它不会返回任何内容。谁能帮我解决我的问题? 谢谢!!! 问题答案: 您应该始终将获取数据等关注