javascript - Cordova 3.5.0 上的 SQLite 插件无法正常工作

标签 javascript android sqlite cordova

我是 Cordova Android 开发新手,这是我在 Stack Overflow 上发表的第一篇文章。我正在尝试使用预填充的 SQlite 数据库中的数据作为 ListView 项名称来创建 Android ListView ,当单击这些 ListView 项时,将使用来自同一 SQLite 数据库的数据和详细信息打开一个新页面。 (例如“页面 1”将使用预先填充的 SQlite 数据库中的数据动态创建一个 ListView ,当单击 ListView 项目时,将打开一个新页面“页面 2”,其中包含存储在同一数据库中的相关数据,例如“第 1 页”和“第 2 页”中的分行详细信息)。我已经从 Git Hub 安装了 Sqlite 插件,但还没有成功。有人能帮我解决这个问题吗?如有任何疑问,我们将不胜感激。

提前致谢。

注意我使用 Cordova 3.5.0 CLI 和 Eclipse 进行开发,使用 Android 4.1.2 Jelly Bean Mobile(不是模拟器,而是真正的手机)进行测试,我的代码如下----

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<meta name="viewport" content="width=device-width, initial-scale=1">

<script src="js/jquery-1.11.1.js"></script>

<script src="js/jquery.mobile-1.4.2.js"></script>

<script src="js/jquery.mobile-1.4.2.min.js"></script>

<link rel="stylesheet" href="css/themes/jquery.mobile.icons.min.css" />

<link rel="stylesheet" href="css/themes/shiplu.css.min.css" />

<link rel="stylesheet" href="css/list.css" />

<link rel="stylesheet" href="css/jquery.mobile-1.4.2.css">

<script type="text/javascript" charset="utf-8">

document.addEventListener("deviceready", onDeviceReady, false);

function onDeviceReady() {

var db = window.sqlitePlugin.openDatabase({name: "gmapdata"});

 db.transaction(populateDB, errorCB, successCB);
}
// create table

function populateDB(tx) {
 tx.executeSql('DROP TABLE IF EXISTS markers');
 tx.executeSql('CREATE TABLE IF NOT EXISTS markers (id INT PRIMARY KEY  NOT NULL , name VARCHAR( 60 ) NOT NULL, address     VARCHAR( 80 ) NOT NULL , lat FLOAT( 10, 8 ) NOT NULL , lng FLOAT( 10, 8 ) NOT NULL , status VARCHAR, num VARCHAR DEFAULT (null) , zone VARCHAR, district VARCHAR)');
 tx.executeSql('INSERT INTO markers VALUES (?,?,?,?,?,?,?,?,?)', [2,'Motijheel Branch (AD)','161 Motijheel Commercial Area,  \n Dhaka- 1000 \n Ph: 9569350 (D) 7125266, 9564190, 01715028067 \n Fax: 9567664 ',23.722222,90.42171,'',NULL,'Corporate','Dhaka']);
 queryDB(tx);
}

// form the query
function queryDB(tx) {
tx.executeSql("SELECT name, address, district, zone from markers;", [], querySuccess, errorCB);
}
// Display the results
function querySuccess(tx, results) {
var len = results.rows.length;
//alert("results.rows.length: " + results.rows.length + " [should be 2]");

if(len>0)
{

document.write("<ul data-role='listview'>");

for (var i = 0; i < len; i++) { // loop as many times as there are row results

document.getElementById("output").innerHTML +=
    "<li><a href='#'>"+ results.rows.item(i).name +"</a></li>";
}
document.write("</ul>");
}
// Transaction error callback
function errorCB(err) {
console.log("Error processing SQL: " + err.code);
}
// Success error callback
function successCB() {
}
</script>

</head>

<body>

<script type="text/javascript" src="cordova.js"></script>


<div data-role="page" data-theme="f" id="br_list">


<div role="banner" class="ui-bar-a ui-header" data-role="header">
            <a data-theme="F" href="index.html" class="ui-btn-left ui-btn ui-btn-icon-left ui-btn-corner-all ui-shadow ui-btn-up-a" data-icon="arrow-l"><span class="ui-btn-inner ui-btn-corner-all"><span class="ui-btn-text">Back</span><span class="ui-icon ui-icon-arrow-l ui-icon-shadow"></span></span></a>
            <h1 aria-level="1" role="heading" tabindex="0" class="ui-title">Branch List</h1>
</div>


<div class="segment">

    <div id="output" align ="center"><img src="img/loading.gif"></div>

</div>

<div data-role="footer" >
                <h4>********</h4>
</div><!-- /footer -->

</div>

</body>

</html>

最佳答案

您是否在工作中使用任何 Javascript 编辑器?你需要为你的 eclipse 下载一个好的 JS 编辑器,这将 突出显示代码中的任何语法错误。如果您有任何语法错误,您的真实设备将不会显示任何消息,并且 它会默默地失败。

我建议您从应用程序中删除所有 jquery 代码并仅测试 cordova 功能。一旦你的 cordova 数据库功能开始工作,你就可以添加你的 jquery 代码了。

您是否已将 SQLite 插件添加到您的项目中。如果没有,那么代码中的以下行将不起作用。

var db = window.sqlitePlugin.openDatabase({name: "gmapdata"});

您需要改用 cordova 核心数据库 API。请引用 Cordova 链接这里作为引用 https://cordova.apache.org/docs/en/3.0.0/cordova_storage_storage.md.html
下面是示例代码。

var db = window.openDatabase("test", "1.0", "Test DB", 1000000);

当您在真实设备或模拟器上进行测试时也是如此。您需要确保每次测试应用程序时都卸载该应用程序。
您可以使用alert()调用来代替,如下所示。

// Transaction error callback
function errorCB(err) {
alert("Error processing SQL: " + err.code);
}
// Success error callback
function successCB() {
    alert("successCB() called");
}

您还可以在最后一个插入调用中添加queryDB(),如下所示。
另请注意,我已将 errorCB() 添加到插入调用中,可以很好地警告任何错误。

tx.executeSql('INSERT INTO markers VALUES (?,?,?,?,?,?,?,?,?)', 
[2,'Motijheel Branch (AD)','161 Motijheel Commercial Area,  \n Dhaka- 1000 \n Ph: 9569350 (D) 7125266, 9564190, 01715028067 \n Fax: 9567664 ',23.722222,90.42171,'',NULL,
'Corporate','Dhaka'],queryDB,errorCB);
//queryDB(tx);

将queryDB的定义更改为

function queryDB(tx, results) {...}

希望有帮助。

关于javascript - Cordova 3.5.0 上的 SQLite 插件无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24477162/

相关文章:

android - SQLCipher findLibrary 返回空

ruby-on-rails - Rails 4 SQLite3::ReadOnlyException:尝试写入只读数据库

javascript - 奇怪的关闭行为

javascript - 如何连接 require.js 和 jquery.min.js?

JavaScript 跨浏览器 : Is it safe to treat a string as array?

c# - 为什么我不能将早期的 xamarin 表单版本作为 nuget 添加到我的 Xamarin 表单项目/android 包中?

android - 如何在 sqlite 中选择/删除当前时间之前 24 小时内的所有行

javascript - 将逗号分隔字符转换为逗号分隔整数

java - 我应该如何在 Google Play 管理中心中启用我的 AdMob 真实 ID?

android - Android Cursor 的读取是否一直到数据库?