2

sqlite を使用して、DB にいくつかのテーブルを設定しました。データベースを実行し、テーブルからいくつかの値を選択する別の JavaScript ページで関数を作成しました。関数は $(document).ready() で呼び出されます。

Javascript:

 //DB Population
function onDeviceReady() {
    var db = window.openDatabase("Database", "1.0", "SqliteTrial", 20000);
    db.transaction(populateDB, errorCB, successCB);
}

function populateDB(tx) {
tx.executeSql('DROP TABLE IF EXISTS Subjects');
tx.executeSql('CREATE TABLE IF NOT EXISTS Subjects (id unique, subjectname)');
tx.executeSql('INSERT INTO Subjects (id, subjectname) VALUES (1, "Math")');
tx.executeSql('INSERT INTO Subjects (id, subjectname) VALUES (2, "Science")');
}  

function GetSubjectsFromDB()
{
    console.log("");
    tx.executeSql('SELECT * FROM Subjects', [], queryNSuccess, errorCB);
}

function queryNSuccess(tx, results) {
    alert("Query Success");
    console.log("Returned rows = " + results.rows.length);
    if (!results.rowsAffected) {
        console.log('No rows affected!');
        return false;
    }
    console.log("Last inserted row ID = " + results.insertId);
}

function errorCB(err) {
    alert("Error processing SQL: "+err.code);
}

この行に何か問題がありますか?

tx.executeSql('SELECT * FROM Subjects', [], queryNSuccess, errorCB);

queryNSuccess は呼び出されず、errorCB も呼び出されないため、何が問題なのかわかりません。

これは私が別のページでそれを呼び出す方法です:

Javascript:

     $(document).ready(function () {
            DisplayData();
            GetSubjectsFromDB(tx);
        });
4

1 に答える 1

1

いいえ、そのようには機能しません。txvariable は実際には、メソッドによって指定されたコールバック関数に送信されるパラメーターですdb.transaction。したがって、おそらく代わりにこれを実行したいと思うでしょう:

$(document).ready(function () {
    ...
    db.transaction(GetSubjectsFromDB);            
});

...そして、この関数定義を次のように書き換えます...

function GetSubjectsFromDB(tx) { ... something to do with tx ... }

しかし、私が見ているように、実際には別の問題があります。db接続ハンドル (window.openDatabase呼び出しによって作成される)を格納する変数は、onDeviceReady関数に対してローカルです。つまり、この関数の外では見えません。

これを解決する最も簡単な方法は、グローバル コンテキストでこの変数を定義することです。

var dbh; // the SQLite connection handle
function onDeviceReady() { ... dbh = window.openDatabase ... }
function GetSubjects() { ... dbh.transaction(getSubjectsFromDb) ... }
function getSubjectsFromDb(tx) { ... tx.executeSql(...) ... }

これは、WebSQL DB の一般的な使用法を説明する素晴らしいプレゼンテーションです。ただし、WebSQL DB API は非推奨と見なされていることも付け加えておきます。代わりに IndexedDB を使用することをお勧めします。これについて読むべきものがあります。

于 2012-07-08T17:01:24.187 に答える