0

データベースローカルからデータを取得するアプリを作成しています。私は3つのテーブルを持っています。私が欲しいのは、最初のテーブルからデータを取得するときです。たとえば、従業員の詳細から、従業員がスーパーユーザーである場合はいくつかの条件を確認し、2 番目のテーブルのプロジェクトの詳細からデータを取得します。だから私が望むのは、従業員がスーパーユーザーの場合、2番目のテーブルからデータフェッチを実行してからさらに移動する必要があるということです。しかし、スーパーユーザー条件を取得し、その中に tx.executeSql 関数が見つかるとすぐに、スレッドが作成され、最初のテーブルからさらに実行が続行され、完了後にプロジェクトの詳細からデータの実行が開始されます。この実行を私が望むフローで機能させるのに役立つ人はいますか?

function getusersdetails()
{
    db.transaction(function(tx){
        tx.executeSql('select * from users',[],function(tx,results){
            var dataset = results.rows.length;
            if(dataset>0)
            {
                for(var i=0;i<dataset;i++)
                {
                    if(results.rows.item(i).employ_type =='SU')
                    {
                        tx.executeSql('Select * from accessRites where user_Id = results.rows.item(i).user_id',[],function(tx,result){
                            //some execution here;
                        });
                    }
                    else if(results.rows.item(i).employ_type =='Manager')
                        {
                            tx.executeSql('Select * from usergroups where user_Id =  results.rows.item(i).user_id',[],function(tx,results){
                                // some execution here;
                            });
                        }
                    else
                    {
                        //some execution here;
                    }
                    //here some usere execution ;
                }
            }
        });
    });

上記のコードでは、ユーザー タイプが su の場合、tx.executeSql 関数を検出するとすぐに 2 番目の関数を実行する代わりに、最初のクエリの実行を続行し、SU 条件で tx.execute を実行します。ユーザータイプが Su の場合、その内部で tx.execute 関数を完了し、最後にデータが必要なため、さらに実行を続行する必要があります。

4

1 に答える 1

0

executeSqlコールバックは常に非同期で実行されます。

「ここで何らかの実行」コードが他のコードから独立しているように、コードを作成する必要があります。

または、結合を使用して必要なすべてのデータを取得して、単一の結果セットを取得することもできます。

tx.executeSql('SELECT * FROM users' +
              ' LEFT JOIN accesRites USING (user_Id)' +
              ' LEFT JOIN usergroups USING (user_Id)',
              [], function(tx, result){
    for (var i = 0; i < results.rows.length; i++) {
        if (results.rows.item(i).employ_type =='SU') {
            ...
        } else if (results.rows.item(i).employ_type =='Manager') {
            ...
        } else {
            ...
        }
    }
});

注: 1 つのレコードに対して複数の一致するaccessRights/usergroupsレコードがあるusers場合、結果に重複usersデータを含む複数のレコードが表示されます。

于 2013-11-05T09:40:44.737 に答える