4

cordova-sqlite から同期的にデータをフェッチすることは可能ですか?

caseTableフィールド (ID、ケース名、日付)を持つテーブルがあります。そのテーブルの各行は、caseName フィールドにちなんで名付けられた別のテーブルに対応しています。テーブルをループして、caseTable参照されているテーブル内の行数を取得する必要があります。

function onDeviceReady() {
    db = window.openDatabase("Casepad", "1.0", "Casepad", 200000);
    db.transaction(getallTableData, errorCB);    
}

function insertData() {
    db.transaction(createTable, errorCB, afterSuccessTableCreation);
}

// create table and insert some record
function createTable(tx) {
    tx.executeSql('CREATE TABLE IF NOT EXISTS CaseTable (id INTEGER PRIMARY KEY AUTOINCREMENT, CaseName  TEXT unique NOT NULL ,CaseDate INTEGER ,TextArea TEXT NOT NULL)');

    tx.executeSql('INSERT OR IGNORE INTO CaseTable(CaseName,CaseDate,TextArea) VALUES ("' + $('.caseName_h').val() + '", "' + $('.caseDate_h').val() + '","' + $('.caseTextArea_h').val() + '")');


}
// function will be called when an error occurred
function errorCB(err) {
    navigator.notification.alert("Error processing SQL: " + err.code);
}

// function will be called when process succeed
function afterSuccessTableCreation() {
    console.log("success!");
    db.transaction(getallTableData, errorCB);
}


// select all from SoccerPlayer
function getallTableData(tx) {
    tx.executeSql('SELECT * FROM CaseTable', [], querySuccess, errorCB);
}


function querySuccess(tx, result) {
    var len = result.rows.length;
    var t;
    $('#folderData').empty();
    for (var i = 0; i < len; i++) {
        /* *************************************************************
         * Here i need to call a synchronous method which returns the
         * number of rows in the result.rows.item(i).CaseName table 
         * ************************************************************* */
        $('#folderData').append(
                '<li class="caseRowClick" id="' + result.rows.item(i).id + '" data-rel="popup" data-position-to="window">' + '<a href="#">' + '<img src="img/Blue-Folder.png">' + '<h2>' + result.rows.item(i).CaseName + t+'</h2>' + '<p>' + result.rows.item(i).TextArea + '</p>' + '<p>' + result.rows.item(i).CaseDate + '</p>' + '<span class="ui-li-count">' + i + '</span></a>' + 
                 '<span class="ctrl togg"><fieldset data-role="controlgroup" data-type="horizontal" data-mini="true" ><button class="edit button_design">Edit</button><button class="del button_design">Delete</button></fieldset><span>'+'</li>'
                );
    }
    $('#folderData').listview('refresh');

}

リストビューに「i」の値を表示する目的で、そのテーブル内の要素の数を表示する必要があります。この要素の「result.rows.item(i).CaseName」の要素数をカウントするクエリを呼び出す必要があるため、同期を呼び出す必要があります..?

例を挙げて...

DB 名Case Pad テーブル名 CaseTable

    Let assume having entries in caseTable.


      ID      CaseName      Case Date   caseNote
        1         Test           3/77/13   jgjgj
        2         Test2          4/34/3   hsadkkadsh 


Now I have two more table in DB
Test , Test2..

    **Test** having entries like this

       ID          DocumentName    Date         Notes
       1)           ppp              7/33         asdhdfkdshf
       2)           asdjhad            9/44       dfjasgfsjfj
    **Test2** having entries like this

       ID          DocumentName    Date         Notes
       1)           sad            7/4         asdhdfkdshf
       2)           assd           3/44          hhhhhh
       3)            asd           2/22          adgjad

Test 、 Test2 のエントリは 2 と 3 です。

ここで、CaseTable のデータをフェッチする必要があります。フェッチ中に、ケース名テーブル (Test、Test1) の要素の数をカウントする必要があります。ここだけ

 function getallTableData(tx) {
        tx.executeSql('SELECT * FROM CaseTable', [], querySuccess, errorCB);
    }



    function querySuccess(tx, result) {
        var len = result.rows.length;
        var t;
        $('#folderData').empty();
        for (var i = 0; i < len; i++) {
    Here i need to call synchronize method which call the number of element in in that  result.rows.item(i).CaseName and insert it in this table
    ****************************************************************************
            $('#folderData').append(
                    '<li class="caseRowClick" id="' + result.rows.item(i).id + '" data-rel="popup" data-position-to="window">' + '<a href="#">' + '<img src="img/Blue-Folder.png">' + '<h2>' + result.rows.item(i).CaseName + t+'</h2>' + '<p>' + result.rows.item(i).TextArea + '</p>' + '<p>' + result.rows.item(i).CaseDate + '</p>' + '<span class="ui-li-count">' + i + '</span></a>' + 
                     '<span class="ctrl togg"><fieldset data-role="controlgroup" data-type="horizontal" data-mini="true" ><button class="edit button_design">Edit</button><button class="del button_design">Delete</button></fieldset><span>'+'</li>'
                    );
        }
        $('#folderData').listview('refresh');

    }

casename casedate case Note ,number of elements を印刷する必要がある ので、私のリストは次のようになります

 Test           3/77/13   jgjgj      2
 Test2          4/34/3   hsadkkadsh  3

その表に 2 と 3 を出力する方法...:( 質問をお願いします)

4

3 に答える 3

0

次のようなことを行うことで、それらを非同期にループできます (テストされていませんが、アイデアが得られることを願っています)。

var count = 0;
var caseTableResult = [];

var getallTableData = function (tx) {
    tx.executeSql('SELECT * FROM CaseTable', [], querySuccess, errorCB);
}

var querySuccess = function (tx, result) {
    if (count === 0) {
        caseTableResult = result;
        $('#folderData').empty();
    } else {
        var i = count - 1;
        $('#folderData').append(
                '<li class="caseRowClick" id="' + caseTableResult.rows.item(i).id + '" data-rel="popup" data-position-to="window">' + '<a href="#">' + '<img src="img/Blue-Folder.png">' + '<h2>' + caseTableResult.rows.item(i).CaseName + t+'</h2>' + '<p>' + caseTableResult.rows.item(i).TextArea + '</p>' + '<p>' + caseTableResult.rows.item(i).CaseDate + '</p>' + '<span class="ui-li-count">' + i + '</span></a>' + 
                 '<span class="ctrl togg"><fieldset data-role="controlgroup" data-type="horizontal" data-mini="true" ><button class="edit button_design">Edit</button><button class="del button_design">Delete</button></fieldset><span>'+'</li>'
        );
    }

    if (count <= caseTableResult.rows.length) {
        // Call the next query
        count += 1;
        tx.executeSql('SELECT count(*) FROM ' + caseTableResult.rows.item(i).CaseName, [], querySuccess, errorCB);
    } else {
        // We're done
        $('#folderData').listview('refresh');
    }

}

しかし、実際には、同じ構造で異なる名前のテーブルを多数作成するべきではありません。関係によってすべてのデータが接続された 1 つのテーブルが必要です。その後、私の他の回答を使用できます。

于 2013-07-21T00:29:25.393 に答える
0

私はこれが好きです..!!それは働いています..助けてくれてありがとう

function getallTableData(tx) {
     // tx.executeSql("DROP TABLE IF EXISTS a");

   tx.executeSql('SELECT * FROM CaseTable', [], querySuccess, errorCB);
}




function querySuccess(tx, result) {


    var len = result.rows.length;
    var countDoument=0
    $('#folderData').empty();
    for (var i = 0; i < len; i++) {

         alert(i)

         test1=result.rows.item(i).CaseName;


     Test1(test1, function(i) {
      return function(result_count) {
        countDoument = result_count; // here it count value 
        alert(result_count + "result_count") //alert is correct count value
        alert(i + "i"); 

        $('#folderData').append(
            '<li class="caseRowClick" id="' + result.rows.item(i).id + '" data-rel="popup" data-position-to="window">' + '<a href="#">' + '<img src="img/Blue-Folder.png">' + '<h2>' + result.rows.item(i).CaseName + countDoument + '</h2>' + '<p>' + result.rows.item(i).TextArea + '</p>' + '<p>' + result.rows.item(i).CaseDate + '</p>' +'<span class="ui-li-count">' + i + '</span>'+  '</a>' +
            '<span class="ctrl togg"><fieldset data-role="controlgroup" data-type="horizontal" data-mini="true" ><button class="edit button_design">Edit</button><button class="del button_design">Delete</button></fieldset><span>' + '<span class="ui-li-count">' + i + '</span>'+ '</li>'
        );
           $('#folderData').listview('refresh');

      };

    }(i));





}


}

function Test1(test, callBack){
    var x;
    db.transaction(function (tx) {
            $yoursql = 'SELECT * FROM  "'+test+'" ';
            tx.executeSql($yoursql, [], function (tx, results) {
                x = results.rows.length  + "TableName" + test;
                callBack(x);                
            });
    });

}
于 2013-07-21T00:41:30.270 に答える
0

これを同期的に行うことが可能だとは思いませんし、試すのはおそらく良い考えではありません。

この場合、おそらく次のようなサブクエリを使用した後の値を取得できます。

SELECT *, 
    (SELECT COUNT(*) FROM CaseTableDetail WHERE CaseTableDetail.CaseID = CaseTable.id)
        AS CaseCount
FROM CaseTable;

(CaseName テーブルの完全なテーブル構造を指定していないため、これは単なる推測です)

編集:

上記が機能するには、テーブルを動的に追加するのではなく、適切なリレーショナル構造が必要です。テーブルは 2 つだけ必要です。CaseTable と CaseDetailTable と呼びます。

CaseTable はまさにあなたがすでに持っているものです。

CaseDetailTable は、上記の Test および Test2 テーブルに似ていますが、CaseID フィールドが追加されています。これで、DB Test に Test2 という 2 つのテーブルが追加されました。

   ID    CaseID      DocumentName    Date        Notes
    1         1      ppp             7/33        asdhdfkdshf
    2         1      asdjhad         9/44        dfjasgfsjfj
    3         2      sad              7/4        asdhdfkdshf
    4         2      assd            3/44        hhhhhh
    5         2      asd             2/22        adgjad

したがって、CaseID フィールドは、各行が含まれる CaseTable 内のエントリへのポインターです。上記で使用したような WHERE、JOIN、およびサブクエリを使用すると、すべてのデータにはるかに効率的にアクセスできます。REFERENCES キーワードを使用して、これが実行していることを SQLite に伝えることができます。これにより、CaseDetails の検索を高速化するためにインデックスを作成するようにデータベースに指示し、CaseTable に対応するエントリがない限り、CaseDetailTable に行を追加できないようにします。

CaseDetailTable は次のように作成できます。

   CREATE TABLE CaseDetailTable (
       id INTEGER PRIMARY KEY AUTOINCREMENT,
       CaseID INTEGER REFERENCES CaseTable (ID),
       Notes  TEXT unique NOT NULL,
       DocumentName INTEGER,
       Date TEXT NOT NULL
   );
于 2013-07-20T00:13:50.800 に答える