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 永远不会成为官方标准,并且它的开发已经停止。但如果你只是想瞄准黑莓,它可能是一个有效的选择。

于 2012-12-27T15:58:09.803 回答
1

您发布的代码存在一些问题,包括在内置成功和错误处理程序时对块的引用和使用.lenght。所以我做了一个演示。.lengthtry catch

首先,它似乎没有什么区别,但这是 HTML5对吧?代替HTML 4.01 Transitional文档类型,使用 HTML5 文档类型:

<!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 加载。请记住,我没有黑莓来测试它,并且对于黑莓或其他设备,您可能应该使用deviceready而不是load. 我认为。我还附加了button该运行的事件处理程序使用的查询.addEventListener,但请注意我在负载处理程序中执行此操作。在尝试访问 DOM 之前,您必须等待。

此外,IE 支持attachEvent而不是addEventListener. 我想黑莓支持后者,但我不确定。

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条目数组清空到INSERT. dropped并为and交易created做同样的事情。DROPCREATE

特别注意我是如何做到这一点的;看到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()callback在这种情况下是view,它指向贯穿结果集并table从集合中创建 a 的函数。

    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;

注意最后两个参数,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 回答