4

是否可以从 cordova-sqlite 同步获取数据?

我有一个caseTable包含字段(ID、caseName、日期)的表。该表中的每一行对应于另一个以 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 的数据。在获取时,我需要计算我的 casename 表(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 注意,元素数量 所以我的列表看起来像这样

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

如何在该表中打印 2 和 3 ......:(您能给我任何查询吗)

4

3 回答 3

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..

   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,并且它将确保您不能向 CaseDetailTable 添加任何行,除非您在 CaseTable 中有相应的条目。

您可以按如下方式创建 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 回答
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');
    }

}

但实际上你不应该创建很多具有相同结构和不同名称的表,你应该有一个表,所有数据都通过关系连接,然后你可以使用我的另一个答案

于 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 回答