0

JavaScript コードで Sql Lite データベースにアクセスしたいと考えています。JavaScript コードは html5 で使用され、blackberry 10 プラットフォームにデプロイする必要があります。次のコードを使用しても成功しません。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
    <title>Prova</title>
</head>
<body>
    <script type="text/javascript">
//Provenia SRL ITC - Paola Savioli
//Questa funzione apre il database SQL Lite
//Il parametro che va cambiato è il nome del database
function ApriDatabase() {
    try {
        if (window.openDatabase) {
            var shortName = 'Ristoranti.sqllite';
            var version = '1.0';
            var displayName = 'Ristoranti italia';
            var maxSize = 65536; // in bytes
            db = openDatabase(shortName, version, displayName, maxSize);
        }
    } catch (e) {
        alert('Apri Database' + e);
    }
}
//Provenia SRL ITC - Paola Savioli
// Questa funzione eseque una query su un database aperto con la funzione ApriDatabase
function EseguiQuery($query, callback) {
    try {
        ApriDatabase();
        if (window.openDatabase) {
            db.transaction(

            function (tx) {
                tx.executeSql($query, [], function (tx, result) {
                    if (typeof (callback) == "function") {
                        callback(result);
                    } else {
                        if (callback != undefined) {
                            eval(callback + "(result)");
                        }
                    }
                }, function (tx, error) {});
            });
            return rslt;
        }
    } catch (e) {
        alert('Esegui Query' + e);
    }
}

function VisualizzaComuni() {
    try {
        var schemanode = document.GetElementById('RCOMUNI');
        schemanode.innerHTML = "";
        var result = EseguiQuery('SELECT * FROM COMUNE');
        for (var i = 0; i < result.rows.lenght; ++i) {
            var row = result.row.item(i);
            var notediv = document.createElement('div');
            notediv.innerHTML = 'Codice Provincia:' + row['PROVINCIA'] + 'Nome:' + row['NAME'];
            schemanode.appendchild(notediv);
        }
    } catch (e) {
        alert('Visualizza Comuni' + e);
    }
}
</script>
    <input type="button" name='select' onClick="VisualizzaComuni()"
        value='Visualizza Comuni'>
    <div id="RCOMUNI"></div>
</body>
</html>
4

2 に答える 2

1

http://caniuse.com/#feat=sql-storageに従って、BlackBerry 7 および 10 でサポートされているWebSQL APIの使用を検討してください。

API が正式な標準になることはなく、その開発は停止していることに注意してください。しかし、BlackBerry をターゲットにしたいだけなら、これは有効な選択かもしれません。

于 2012-12-27T15:58:09.803 に答える
1

成功およびエラー ハンドラが組み込まれている場合のブロックの.lenght代わりの参照.lengthやブロックの使用など、投稿したコードにはいくつかの問題がありました。try catchというわけでデモを作ってみました。

まず、違いがないように見えますが、これは HTML5ですよね? doctypeの代わりにHTML 4.01 Transitional、HTML5 doctype を使用します。

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>demo by userdude</title>
...

次に、デモンストレーションのためにマークアップを変更しました。この場合、次のようになります。

<body>
<input type="button" id="run" value='Run Query'>
<div id="query"></div>
<table id="table" border="1" cellspacing="1" cellpadding="5"></table>
</body>
</html>

このhead要素では、イベント リスナーを使用して DOM が読み込まれるのを待ちます。これをテストするための Blackberry はありません。Blackberry またはその他のデバイスでは、devicereadyおそらくload. おもう。buttonを使用してその実行のクエリのイベント ハンドラーもアタッチしますが、ロード ハンドラー内で.addEventListenerそれを行っていることに注意してください。DOM にアクセスする前に待機する必要があります。

また、IE はattachEventの代わりにサポートしていaddEventListenerます。Blackberry は後者をサポートしていると思いますが、よくわかりません。

window.addEventListener('load', function load(){
    var run = document.getElementById('run'),
        data = document.getElementById('table'),
        qtext = document.getElementById('query'),
        dropped = false,
        created = false,
        cities = ['Houston', 'Dallas', 'Paris', 'New York', 'Buenos Aires', 'London'],
        shortName = 'Cities',
        version = '1.0',
        displayName = 'Cities Demo',
        maxSize = 5 * 1024 * 1024,
        db = false,
        queries = [];

    run.addEventListener('click', query);

これにより、 populate() への最初の呼び出しを実行するなど、データベースが確立されるため、データを使用できます。

    open();

実行ボタンに追加した機能です。

    function query() {
        transact('SELECT * FROM Cities', view);
    }

これは、データベースにデータを追加するためのものです。cities上記の変数を参照してください。

    function populate(tx) {
        var city,
            i = 0;

citiesへのエントリの配列を空にしたら、これの実行をブロックしますINSERTdroppedandトランザクションcreatedに対しても同じことを行いDROPます。CREATE

私がこれをどのように行っているかに特に注意してください。を参照してくださいtransact('...', populate)。この状況では、すべてのエントリpopulateの追加が完了するまでループバックするために使用します。citiesこれは非同期であるため、前のクエリが実行されるまで、必要に応じて待機するようにコールバックをセットアップする必要があります。この場合、行を追加した後にテーブルを削除することになる可能性があります。そのため、待機してからリストループする必要がありcitiesます。

        if (cities) {
            if (!dropped) {
                dropped = true;
                transact('DROP TABLE IF EXISTS Cities', populate);

                return;
            }

            if (!created) {
                created = true;
                transact('CREATE TABLE IF NOT EXISTS Cities (id unique, City)', populate);

                return;

            }

先に進むpopulate必要があるだけなので、ここまで繰り返す必要はありません。INSERT

            while (city = cities.pop()) {
                transact('INSERT INTO Cities (id, City) VALUES (' + i++ + ', "' + city + '")');
            }

            cities = false;
        }
    }

この関数が行うのは、データベースへの開かれた参照または新しい参照、またはreturn false. これにより、 の実行が短縮されtransact()ます。

    function open() {
        if (!db && window.openDatabase) {
            db = window.openDatabase(shortName, version, displayName, maxSize);
        }

        if (cities) {
            db.transaction(populate);
        }

        return db;
    }

これがスクリプトの要です。query()fromを呼び出しますcallback。この場合は です。これはview、結果セットを実行し、セットから を作成する関数を指しtableます。

    function transact(query, callback) {
        var cb = callback,
            qel = document.createElement('p'),
            qid = queries.length;

        if (!open()) {
            console.log('HTML5 Database not supported.');

            return false;
        }

        db.transaction(transact_cb);

        qel.innerHTML = query + ' Query Result: <span id="q' + qid + '">Pending...</span>';

        qtext.appendChild(qel);

        queries[qid] = query;

最後の 2 つの引数 に注意してくださいtransact_success, transact_error。これは、これらの非同期呼び出しを処理する方法です。

        function transact_cb(tx) {
            tx.executeSql(query, [], transact_success, transact_error);
        }

なぜそこに があるのか​​ よくわかりませんeval...?

        function transact_success(tx, result) {
            var rtext = document.getElementById('q' + qid);

            rtext.className = 'success';
            rtext.innerHTML = 'Success.';

            if (typeof cb == "function") {
                cb(result);
            } else if (cb != undefined) {
                eval(cb + "(result)");
            }
        }

に注意してくださいconsole.log(error);

        function transact_error(tx, error) {
            var rtext = document.getElementById('q' + qid);

            rtext.className = 'error';
            rtext.innerHTML = 'Error logged to console.';

            console.log(error);
        }
    }

そして、この関数はtable結果セット ビューを作成します。おそらく、各行と各行の列をループ処理していることに気付くでしょう。

    function view(result) {
        var thead = '<thead><tr>',
            tbody = '<tbody>',
            row,
            col;

        for (var i = 0, rows = result.rows.length; i < rows; ++i) {
            row = result.rows.item(i);

            tbody += '<tr>';

            for (col in row) {
                if (i === 0) {
                    thead += "<th>" + col + "</th>";
                }

                tbody += '<td>' + row[col] + '</td>';
            }

            tbody += '</tr>';
        }

        thead += '</tr></thead>';
        tbody += '</tbody>';

        data.innerHTML = thead + tbody;
    }

});

ここから HTML ファイルをダウンロードすると、ファイルをダウンロードしてローカルで実行できます (セキュリティ エラーのため、jsFiddle では実行されません)。

http://pastebin.com/FcSiu6ZZ

では、どうぞ。うまくいけば、これが理解しやすくなります。ご不明な点がございましたら、お知らせください。

于 2012-12-27T20:18:26.297 に答える