3

私は現在、サーバーからデバイスへのデータのプルをサポートし、そのデータをデバイスの SQLite DB に格納し、ユーザーがデータを操作できるようにしてから、SQLite DB からデータをプッシュするプロトタイプ モバイル アプリに取り組んでいます。サーバーまで。これまでのところ、最後の部分まですべてがうまく機能しています。SQLite テーブルから情報を取得して JSON オブジェクトに戻し、サーバーにプッシュするのに問題があります。

この時点での私の基本的な問題は、JavaScript のすべての db トランザクションが私の理解から非同期であることを考慮して、SQLite のデータから JSON オブジェクトを構築する方法を理解することです。

いくつかのサンプルコードを含む jsFiddle があります: http://jsfiddle.net/uu29g/

私の希望は、次のようなものをサーバーにプッシュすることです。

[{"order_num": "2001", "custnum": "ABC123", "custname": "Demo Customer", "status": "S", "id": 1, "lineitems": [{"id": 1, "line_num": "1", "part_num": "WSC599", "part_desc": 'Widget A', "qty": "2.0", "price": "15.00"}, {"id": 2, "line_num": "2", "part_num": "FFC898B", "part_desc": 'Dongle B', "qty": "1.0", "price": "32.98"},
{"id": 3, "line_num": "3", "part_num": "RQFG", "part_desc": 'Dooflatchie', "qty": "5.0", "price": "200"}]},{"order_num": "2002", "custnum": "ZXY987", "custname": "Another Customer", "status": "S", "id": 2, "lineitems": [{"id": 1, "line_num": "1", "part_num": "GHJH11", "part_desc": 'Lightsaber - Green', "qty": "1.0", "price": "1500.00"}, 
{"id": 2, "line_num": "2", "part_num": "C3P0", "part_desc": 'Protocol Droid', "qty": "1.0", "price": "9811.04"}]}]

jsFiddle の例のデータベースを考えると、SQLite データから上記のようなオブジェクトを生成する最良の方法は何でしょうか? 編集: 具体的には、3 つの非同期クエリからそのオブジェクトを構築するにはどうすればよいですか? 私の現在の考えは、order_header テーブル (私の jsFiddle の例) から注文番号のリストを取得し、それらの注文番号をループして、各注文のテーブルから order_header 情報と order_detail/line item 情報を引き出し、それをオブジェクトを作成し、各注文オブジェクトを最終的な配列/オブジェクトにプッシュします。私が苦労しているのは、SQL クエリが非同期のときに SQLite からヘッダーと詳細データを取得する方法です。(そして、私はこれについて完全に間違っているかもしれません)。

*FYI: jQuery の Deferred オブジェクトについてまだ学習中です。私が取り組んでいるアプリは、jQuery Mobile を使用して構築されており、iOS/Android で動作することを意図しており、phoneGap を介してネイティブ アプリに変換されます。

4

2 に答える 2

1

JSON.stringifyを使用できます。JavaScript オブジェクトを文字列に変換します。

また、 jQUEry ajax requestに JavaScript オブジェクトを設定すると、String として送信されます。

于 2012-11-28T15:50:20.550 に答える
0

OK、ウェブ上のいくつかの異なる情報源と多くの試行錯誤のおかげで、私は最終的にこれを理解しました. jsFiddle の例:

基本的に、私がやったことは次のとおりです。

  1. 遅延 SQL トランザクションを実行して、プルする必要がある注文を取得します。
  2. 遅延トランザクションの結果を無名関数にパイプします。
  3. 無名関数で結果をループし、遅延関数の配列を設定して、データを取得する必要がある順序番号を渡します。
  4. 遅延関数の遅延配列に対して $.when.apply(null, deferreds) 関数を実行します。
  5. 各注文が遅延配列で呼び出す遅延関数内で、$.when(...).done() 関数の一部としてすべての SQL を (遅延関数を介して) 実行し、done コールバック内で a を実行します。すべての遅延クエリの結果を処理し、生成された注文オブジェクトをグローバル配列にプッシュする関数。

次に、手順 5 で遅延関数を取得して promise を返す必要があるだけです。これにより、全員が作業を終えたときにグローバル配列で何かを実行できます。

これはもっとうまく書けると確信しており、私のロジックには潜在的な落とし穴があると確信していますが、他の人が同様の問題を抱えている場合、これが正しい軌道に乗ることを願っています.

決して世界で最もクリーンなコードではありませんが、動作します (SQL ステートメント、db init などについては jsFiddle を参照してください)。

var ordersArr = [];

/*
Thanks to Josh Ross's answer here for how to do SQL transactions that return a deferred object
http://stackoverflow.com/questions/8058679/wrapping-websql-executesql-calls-in-a-jquery-deferred-promise
*/
function successWrapper(d) {
//console.log(d);
return (function (tx, data) {
    d.resolve(data)

})
};

function failureWrapper(d) {
console.log("Sql failed");
return (function (tx, error) {
    d.reject(error)
})
};  



function getMyOrdersSQL() {
return $.Deferred(function (d) {
    db.transaction(function (tx) {
                    tx.executeSql(getSyncableOrdersStatement, [], 
                    successWrapper(d), failureWrapper(d));
                });
    });
}

function getHeaderDataSQL(ordernum) {
return $.Deferred(function (d) {
    db.transaction(function (tx) {
                    tx.executeSql(getOrdHeaderSingleStatement, [ordernum], 
                    successWrapper(d), failureWrapper(d));
                });
    });
}


function getDetailDataSQL(ordernum) {
return $.Deferred(function (d) {
    db.transaction(function (tx) {
                    tx.executeSql(getOrderDetStatement, [ordernum], 
                    successWrapper(d), failureWrapper(d));
                });
    });
}

function getNoteDataSQL(ordernum) {
return $.Deferred(function (d) {
    db.transaction(function (tx) {
                    tx.executeSql(getDriverNoteStatment, [ordernum], 
                    successWrapper(d), failureWrapper(d));
                });
    });
}


function getOrders() {

$.when(getMyOrdersSQL()).pipe(function(dta) {
    var deferreds = [];
    //build an array of deferred SQL transactions
    //each deferred transaction should populate an order object, then push it into the final ordersArr array
    if (dta.rows.length > 0) {
        for (var i=0; i<dta.rows.length; i++) {
            //console.log(dta.rows.item(i).order_num);
            deferreds.push(getOrdStuff(dta.rows.item(i).order_num)); //push in a function for each order in the getMyOrdersSQL resultset
        }
        $.when.apply(null, deferreds); //run all the deferred functions

    }else {
        console.log(dta.rows);  
        alert("No records found!");
    }
}).done(function() {

}).fail(function() {
    alert("Failed!");
});
}

function getOrdStuff(ordernum) {
console.log(ordernum);
return $.Deferred(function(d) {
    var orderObj = new Object(); //object to hold the order info
    //getDriverNoteStatment
    //getOrdeDetSingle
    //getOrdHeaderSingleStatement

    $.when(getHeaderDataSQL(ordernum), getDetailDataSQL(ordernum), getNoteDataSQL(ordernum)).done(
    function(dta1, dta2, dta3) {
        //dta1 is the deferred promise/result from the getHeaderDataSQL function
        //dta2 is the deferred promise/result from the getDetailDataSQL function
        //dta3 is the deferred promise/result from the getNoteDataSQL function                      
        var orderHeader = dta1.rows.item(0); 

        var orderNotes = dta3.rows.item(0);

        orderObj.order_num = orderHeader.order_num;
        orderObj.status = orderHeader.status;
        orderObj.shipto_num = orderHeader.shipto_num;
        orderObj.po_num = orderHeader.po_num;
        orderObj.billto_num = orderHeader.billto_num;


        var onObj = new Object(); //order notes object
        orderObj.notes = orderNotes.notes;
        orderObj.notes_dtstamp = orderNotes.dtstamp;

        var odArr = []; //order detail array to hold order line items objects

        for (var k = 0; k<dta2.rows.length; k++) { //loop over line item results
            console.log(dta1.rows.item(0).order_num+' has '+dta2.rows.length+' line items');
            var odObj = new Object();
            var orderDetails = dta2.rows.item(k);
            odObj.line_num = orderDetails.line_num;
            odObj.part_num = orderDetails.part_num;
            odObj.qty = orderDetails.qty;
            odObj.part_desc = orderDetails.part_desc;
            odArr.push(odObj); //push each line item object into the detail array

        }           

        orderObj.lineitems = odArr;
        ordersArr.push(orderObj);
        console.log("got stuff");
        console.log(ordersArr);
        return function(d) {
            d.resolve();    //return the promise
        }

    }).fail(function(etx, err) {
         d.reject(err, etx) //return the error if any transaction failed
    });


});


}
于 2012-12-13T19:58:13.490 に答える