首页 > 解决方案 > 我的日志在 sqlite 数据库事务之后没有执行?为什么它在数据库事务之前执行?

问题描述

我正在从 Sqlite 表中获取数据并在本机反应中存储到数组“favoritesData”中,但问题是,db 事务在日志之后执行,这意味着我得到一个空数组。

任何人都有以下代码的解决方案....

getFavorits =() => {
    favoritesData = []        
    db.transaction(tx => {
        tx.executeSql(
            'SELECT * FROM table_favorites', [],
            (tx, results) => {
                len = results.rows.length;
                console.log('Total Fav = ', len);

                if (len > 0) {

                    for (let i = 0; i < results.rows.length; ++i) {
                        favoritesData.push(results.rows.item(i));
                    }
                }
            }
        );
    });
console.log("FAV DATA: ",favoritesData)
}

标签: javascriptandroidiosreact-native

解决方案


事务是异步的。它不是阻塞的,因此日志记录将(很可能)在数据库操作完成之前执行。您需要将日志记录移动到承诺链中。交易完成后:

getFavorites = () => {
    favoritesData = [];
    db.transaction(tx => 
        tx.executeSql(
            'SELECT * FROM table_favorites', [],
            (tx, results) => {
                len = results.rows.length;
                console.log('Total Fav = ', len);

                for (let i = 0; i < results.rows.length; ++i) {
                    favoritesData.push(results.rows.item(i));
                }
            }
        );
    ).then(() => {
      console.log("FAV DATA: ",favoritesData)
    })
}

或者只是在循环之后记录:

getFavorites = () => {
    favoritesData = [];
    db.transaction(tx => 
        tx.executeSql(
            'SELECT * FROM table_favorites', [],
            (tx, results) => {
                len = results.rows.length;
                console.log('Total Fav = ', len);

                for (let i = 0; i < results.rows.length; ++i) {
                    favoritesData.push(results.rows.item(i));
                }
                console.log("FAV DATA: ",favoritesData)
            }
        );
    )
}

也不需要 if(len > 0) ,因为循环会处理这个问题。


推荐阅读