我正在使用cordova for ios / android制作非常简单的应用程序。我做了一切,但我在数据库中遇到问题。我试图确保当app运行时它寻找互联网,如果互联网可用,而不是使用api登录,但它也创建了两个数据库一个用户登录(我知道这不是好习惯,但我的要求将搜索一些东西加密数据库)并仅保存数据库中的当前用户。而其他数据库将用于存储用户的离线工作。但是当我不清楚如何知道我的数据库是否已经制作完成时。以下是代码,请仔细检查,因为我到处搜索,似乎没有解决方案,除了检查表格,但当我检查表格时,我的程序停止工作。
当应用程序启动时,它会询问用户ID,密码,而不是在命令运行后验证之后。
document.addEventListener("deviceready", onDeviceReady(user, serviceURL, pass), false)
以下是我在deviceready上使用的功能,如果互联网可用,则登录用户并创建数据库,如果互联网不可用,则访问数据库,但这里有问题我如何知道数据库是否存在所以让登录用户以其他方式提醒他第一次需要上网。
function onDeviceReady(user, serviceURL, pass) {
if(navigator.network.connection.type == Connection.NONE)
{
var db = window.openDatabase(
'test',
'1.0.0',
'Test Database',
64 * 1024
);
db.transaction(function (tx) {
tx.executeSql('SELECT * FROM USERS', [], function (tx, results) {
var len = results.rows.length, i;
msg = "<p>Found rows: " + len + "</p>";
}
alert(msg);
for (i = 0; i < len; i++){
alert(results.rows.item(i).user );
}
}, null);
});
}
else
{
alert("Internet is available!!");
$.getJSON(serviceURL + 'APIjson.php?user='+user+'&pass='+pass+'&action=login', function(data)
{
if(data.error==-1)
{
alert("Invalid user id or password.");
return false;
}
else {
//navigator.notification.activityStop(); // for android only
// ActivityIndicator.hide(); // for IOS
window.localStorage["user_id"] = data.id;
var db = window.openDatabase(
'test',
'1.0.0',
'Test Database',
64 * 1024
);
db.transaction(function populateDB(tx) {
tx.executeSql('DROP TABLE IF EXISTS USERS');
tx.executeSql('CREATE TABLE IF NOT EXISTS USERS (id unique, user, pass)');
var sql = 'INSERT INTO USERS (id, user, pass) VALUES (?, ?, ?)';
tx.executeSql(sql,[data.id, user, pass]);
},function errorCB(tx, err) {
alert("Error processing SQL: "+err);
},function successCB() {
alert("success!");
});
window.location.href = "contact.html";
return true;
}
})
}
}
我还尝试在len上检索数据库时添加了多少行并且它应该发出警报,但它失败了,我的应用程序停止工作
if (!len > 0) {
alert("Sorry you need to connect internet for first time use");
return false;
答案 0 :(得分:3)
您应该将javascript重定向移动到成功回调中:
db.transaction(function populateDB(tx) {
tx.executeSql('DROP TABLE IF EXISTS USERS');
tx.executeSql('CREATE TABLE IF NOT EXISTS USERS (id unique, user, pass)');
var sql = 'INSERT INTO USERS (id, user, pass) VALUES (?, ?, ?)';
tx.executeSql(sql,[data.id, user, pass]);
},function errorCB(tx, err) {
alert("Error processing SQL: "+err);
},function successCB(){
alert("success!");
window.location.href = "contact.html";
});
问题是您在交易有机会完成之前导航离开当前页面。回调的全部意义在于,异步任务完成后会调用它。但是,当您离开页面时,webview将简单地删除当前页面上的所有任务并继续。
其次,您应该使用:
而不是drop创建db.executeSql('CREATE TABLE IF NOT EXISTS tableName (someID text primary key, data text)');
查看数据是否已添加:
我建议你使用chrome控制台与db进行交互。 https://developers.google.com/chrome-developer-tools/docs/remote-debugging
您需要编写几个db.executeSql(selectStatement),例如:
db.transaction(function(tx) {
tx.executeSql("select * from table1 where theID ='"+theID+"';", [], function(tx, rs) {
for (var i=0; i < rs.rows.length; i++) {
console.log(rs.rows.item(i));
console.log('data found in db');
}
if(rs.rows.length < 1){
console.log('data not in db');
}
},function(tx,e){console.log(e.message);});
});
要查看数据库,请使用chrome调试器: