【问题标题】:SQLite Plugin on cordova 3.5.0 is not working科尔多瓦 3.5.0 上的 SQLite 插件不起作用
【发布时间】:2014-06-29 14:48:26
【问题描述】:

我是 Cordova Android 开发的新手,这是我在 Stack Overflow 上的第一篇文章。我正在尝试使用预填充的 SQlite 数据库中的数据作为列表视图项目名称创建一个 Android 列表视图,当单击这些列表视图项目时,将使用来自同一 SQLite 数据库的数据打开一个新页面,其中包含详细信息。 (例如,“页面 1”将使用来自预填充 SQlite 数据库的数据动态创建一个列表视图,当单击列表视图项目时,将打开一个新页面“页面 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>

【问题讨论】:

  • 您需要告诉我们您在应用中遇到的错误或行为。你有数据吗?您是否尝试过 alert() 调用进行调试。?你为什么不使用模拟器?每次打开应用程序时都会调用 populateDB()。这将依次触发 INSERT sql 每次。当您创建表 markers 时,使用 id 作为主键。此插入将失败,因为您再次插入 id=2 的记录,因此 populateDB() 将失败。
  • 感谢您的回复。首先,我是科尔多瓦的新手。不,我还没有得到任何数据。我没有使用 alert() 调用进行调试。我正在使用我的手机进行测试,因为它速度很快,我的模拟器需要几天才能启动,对于 ID 部分,这是表中每个分支的唯一编号,而不是自动递增的编号。希望,我已经给出了你所要求的澄清。再次感谢。

标签: javascript android sqlite cordova


【解决方案1】:

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

我建议您从您的应用中删除所有 jquery 代码,然后只测试 cordova 功能。一旦你让你的科尔多瓦数据库功能正常工作,你就可以添加你的 jquery 代码。

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

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

您需要改用cordova 核心数据库API。请参考cordova链接Here供参考 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");
}

您还可以在 Last insert 调用中添加 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) {...}

希望对你有帮助。

【讨论】:

  • 我已经尝试过您的建议,它有效,但前提是我将其称为索引页面,但当我尝试使用链接或从另一个页面调用它时,它什么也不显示。
  • @shiplu_khan 请提出一个新问题。如果答案解决了您当前的问题,请将其标记为已回答,以便对其他用户有用。
  • 我的问题部分解决了,如果你请按照我之前的评论。我想要实现的是从索引页面调用所述页面并在第三页中显示一些详细信息。你能帮我解决这个问题吗?
  • 您如何称呼“详细信息”页面。?您需要指定 URL。如果它与 index.html 位于同一位置,则只需指定页面名称。如果它位于服务器上,则需要指定完整的 URL。
  • index page>列表视图中的分支列表(从sqlite数据库中获取)>从同一本地sqlite数据库中获取的分支详细信息(如分支名称、地址、区域、地区)
猜你喜欢
  • 2017-09-20
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多