#javascript #android #sqlite #cordova
#javascript #Android #sqlite #кордова
Вопрос:
Я новичок в разработке Cordova для Android, и это мой первый пост в Stack Overflow. Я пытаюсь создать Android Listview, используя данные из предварительно заполненной базы данных SQLite в качестве имен элементов listview, и при нажатии на эти элементы listview откроется новая страница с использованием данных из той же базы данных SQLite с подробной информацией. (например, на «странице 1» будет динамически создаваться listview с использованием данных из предварительно заполненной базы данных SQLite, и при нажатии на элемент listview откроется новая страница «Страница 2» со связанными данными, хранящимися в той же базе данных, такими как названия ветвей на «Странице 1» и сведения о ветвях в «Страница 2»). Я установил плагин Sqlite из Git Hub, но пока не повезло. Кто-нибудь может мне помочь в этом вопросе? Любой запрос будет оценен.
Заранее спасибо.
Примечание. Я использую 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>
Комментарии:
1. Вы должны сообщить нам, какие ошибки или поведение вы испытываете в своем приложении. Вы получаете какие-либо данные? Вы пробовали вызывать alert() для отладки.? почему вы не используете эмулятор ?. populateDB() будет вызываться каждый раз, когда вы открываете приложение. Это, в свою очередь, будет запускать вставку sql каждый раз . Поскольку вы создали маркеры таблицы с идентификатором в качестве первичного ключа. Эта вставка завершится ошибкой, поскольку вы снова вставляете запись с id =2, и в результате populateDB() завершится ошибкой.
2. Спасибо за ответ ur. Прежде всего, я новичок в Кордове. Нет, я пока не получаю никаких данных. Я не использовал вызов alert() для отладки. Я использую свой телефон для тестирования, потому что он быстрый, запуск моего эмулятора занимает несколько дней, а для части идентификатора это уникальный номер для каждой ветви в таблице, а не автоматически увеличиваемый. Надеюсь, я дал разъяснения, которые вы просили. Снова спасибо.
Ответ №1:
Используете ли вы какой-либо редактор Javascript для своей работы. Вам нужно загрузить хороший редактор JS для вашего eclipse, который выделит любую синтаксическую ошибку в вашем коде. Если у вас есть какая-либо синтаксическая ошибка, ваше реальное устройство не покажет никакого сообщения, и оно автоматически завершится сбоем.
Я бы посоветовал вам удалить весь код jquery из вашего приложения и просто протестировать функциональность cordova. Как только вы заработаете функциональность базы данных cordova, вы можете добавить свой код jquery.
Добавили ли вы плагин SQLite в свой проект. Если у вас его нет, то следующая строка в вашем коде не будет работать.
var db = window.sqlitePlugin.openDatabase({name: "gmapdata"});
Вместо этого вам нужно использовать API базы данных cordova core. Пожалуйста, обратитесь к ссылке 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() в последний вызов insert, как показано ниже.
также обратите внимание, что я добавил errorCB() в вызов insert, чтобы хорошо предупреждать о любых ошибках.
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) {...}
Надеюсь, это поможет.
Комментарии:
1. Я попробовал ваши предложения, и это работает, но только если я вызываю его как индексную страницу, но когда я пытаюсь вызвать его по ссылке или с другой страницы, он ничего не показывает.
2. @shiplu_khan Пожалуйста, задайте новый вопрос. Если ответ разрешает ваш текущий вопрос, отметьте его как ответ, чтобы он был полезен другим пользователям.
3. моя проблема частично решена, если вы будете любезны следовать моему предыдущему комментарию. Чего я пытаюсь добиться, так это вызвать указанную страницу с индексной страницы и показать некоторые подробности на третьей странице. можете ли вы помочь мне в этом вопросе?
4. Как вы вызываете страницу «подробности».? Вам нужно указать URL-адрес. Если он находится в том же месте, что и index.html , вам нужно только указать название страницы. Если он расположен на сервере, вам необходимо указать полный URL-адрес.
5. индексная страница> список филиалов (извлекается из базы данных sqlite) в listview> сведения о филиале, полученные из той же локальной БАЗЫ ДАННЫХ sqlite (например, название филиала, адрес, зона, район)