Javascript中的SQLite访问

Javascript中的SQLite访问,javascript,html,sqlite,blackberry-10,Javascript,Html,Sqlite,Blackberry 10,我想用JavaScript代码访问SQLLite数据库。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="conte

我想用JavaScript代码访问SQLLite数据库。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>

普罗瓦
//普罗旺尼亚SRL ITC-保拉萨维奥利
//Questa funzione apre il数据库SQL Lite
//数据库中的参数
函数ApriDatabase(){
试一试{
if(window.openDatabase){
var shortName='Ristoranti.sqllite';
变量版本='1.0';
var displayName='Ristoranti italia';
var maxSize=65536;//以字节为单位
db=openDatabase(shortName、version、displayName、maxSize);
}
}捕获(e){
警报(“Apri数据库”+e);
}
}
//普罗旺尼亚SRL ITC-保拉萨维奥利
//查询一个数据库到另一个数据库
函数EseguiQuery($query,callback){
试一试{
ApriDatabase();
if(window.openDatabase){
数据库事务(
功能(tx){
tx.executeSql($query,[],函数(tx,result){
if(typeof(回调)=“函数”){
回调(结果);
}否则{
如果(回调!=未定义){
评估(回调+“(结果)”);
}
}
},函数(tx,error){};
});
返回rslt;
}
}捕获(e){
警报(“Esegui查询”+e);
}
}
函数Visualizacomuni(){
试一试{
var schemanode=document.GetElementById('RCOMUNI');
schemanode.innerHTML=“”;
var result=EseguiQuery('SELECT*FROM-COMUNE');
对于(变量i=0;i<代码> > p>您可以考虑使用黑莓7和10支持的。p>

请注意,API永远不会成为官方标准,对它的开发已经停止。但是如果你只是想把黑莓作为目标,这可能是一个有效的选择。

你发布的代码有一些问题,包括引用
.lenght
而不是
.length
,以及在内置成功和错误处理程序时使用
try catch
块。所以我制作了一个演示

首先,这似乎没有什么区别,但这就是HTML5,对吗?使用HTML5 doctype,而不是
HTML4.01过渡版
doctype:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>demo by userdude</title>
...
这将建立我的数据库,包括运行对populate()的初始调用,以便使用一些数据

    open();
这是我添加到run按钮的函数

    function query() {
        transact('SELECT * FROM Cities', view);
    }
这只是为了向数据库添加数据。请参阅上面的
城市
变量

    function populate(tx) {
        var city,
            i = 0;
一旦我将
cities
条目数组清空到
INSERT
,我就会阻止它运行<代码>删除
和创建对
删除
创建
事务执行相同的操作

特别注意我是如何做到这一点的;请参阅
事务处理(“…”,填充)
?在这种情况下,我使用
populate
循环,直到我添加完所有
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;

            }
我不需要在这里重复
填充
,因为我只需要
插入
并继续

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

            cities = false;
        }
    }
此函数所做的一切就是为数据库提供一个打开的或新的引用,或者
返回false
。这会使
transact()
的执行短路

这是剧本的重点。我从
query()
调用它,本例中的
回调
视图
,它指向在结果集中运行的函数,并从结果集中创建一个

    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;
不太清楚为什么里面有一个
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(错误)

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

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

            console.log(error);
        }
    }
此函数创建
结果集视图。您可能会注意到我循环了每一行和每一行的列

    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;
    }

});
函数视图(结果){
var thead=“”,
t正文=“”,
一行
上校;
对于(变量i=0,行=result.rows.length;i
通过在此处下载HTML文件,您可以下载该文件并在本地运行(由于安全错误,它不会在JSFIDLE上运行):


好了。希望这将有助于更容易理解。如果您有任何问题,请告诉我。

我对blackberry了解不多,但在大多数平台上,不可能有使用Javascript与本地数据库交互的HTML网站(除非它们公开可以使用XmlHttpRequest访问的Web服务)。@Philipp-HTML5在浏览器中包括两个不同的数据库层,包括,由Blackberry 10支持。不过,我不确定这是SQLite格式还是其他格式。下面是BlackBerry10支持的另一个数据库:我只想看看API,看看它提供了什么
        function transact_cb(tx) {
            tx.executeSql(query, [], transact_success, transact_error);
        }
        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)");
            }
        }
        function transact_error(tx, error) {
            var rtext = document.getElementById('q' + qid);

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

            console.log(error);
        }
    }
    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;
    }

});