javascript - 手机间隙 : insert query sqlite when login success

标签 javascript android jquery sqlite cordova

我使用 phonegap 和 jquery mobile 构建了一个移动应用程序混合基础。我的应用程序有一个登录系统,从服务器的数据库中检索数据并在登录成功时将其插入到 sqlite 中,因此即使应用程序处于离线状态也可以访问数据。 我使用来自 litehelpers 的插件.这是我在 database.js 中的 sql 连接脚本:

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

var kode = JSON.parse(window.localStorage['konfirmasi']);

//create or open Database
function connectDB(){
  db = window.sqlitePlugin.openDatabase("konfirmasi", "1.0", "Data Konfirmasi Pengiriman", "1000");
  db.transaction(populateDB,successCB,errorCB);
}

//create table and insert some record
function populateDB(tx) {
    tx.executeSql("CREATE TABLE IF NOT EXISTS data_konfirmasi (kode_transaksi text, status text) UNIQUE(kode_transaksi)");
}

//function will be called when an error occurred
function errorCB(err) {
    console.log("Error processing SQL: "+err.code);
}

//function will be called when process succeed
function successCB() {
    console.log("Connected to database!");
    //db.transaction(queryDB,errorCB);
}

function insertDB(tx){
    for (var i = kode.length - 1; i >= 0; i--) {
        tx.executeSql("INSERT INTO data_konfirmasi VALUES ("+kode[i]+", 'Belum Terkirim');");
    };
}

function queryDB(){
    db.transaction(insertDB,errorCB,querySuccess);
}

function querySuccess(){
    console.log('Insert query success!');
}

function dropDB(){
    db.transaction(dropQuery,errorDrop,successDrop);
}

function dropQuery(tx){
    tx.executeSql("DROP TABLE IF EXIST data_konfirmasi");
}

function successDrop(){
    console.log('Drop table successful');
}

function errorDrop(err){
    console.log('Drop table unsuccessful, Error code: '+err.code);
}

function selectData(err){
    db.transaction(selectQuery, errorCB, successQuery)
}

function selectQuery(tx){
    tx.executeSql('SELECT * FROM data_konfirmasi',[], querySuccess, errorCB);
}

function querySuccess(tx, results) {
    console.log("Returned rows = " + results.rows.length);
    // this will be true since it was a select statement and so rowsAffected was 0
    if (!results.rowsAffected) {
        console.log('No rows affected!');
        return false;
    }
    // for an insert statement, this property will return the ID of the last inserted row
    console.log("Last inserted row ID = " + results.insertId);
}

然后,当用户第一次登录并成功时,它将使用 json 从服务器检索数据,我希望我的应用程序将检索到的数据插入到 sqlite 中。那么,如何只查询登录成功呢?之后,我想让它在注销时删除表并清除 localStorage。 这是我的登录和注销脚本 (main.js):

$(document).on('pageinit','#login',function(){
    $(document).on('click','#submit',function(){
        if($('#username').val().length>0&&$('#password').val().length>0){
            var un = $('#username').val();
            var pw = $('#password').val();
            $.ajax({
                url:'http://qrkonfirmasi.16mb.com/delivery/login.php',
                data:{  username : un,
                        password : pw
                    },
                type:'post',
                async:'false',
                dataType: 'json',
                beforeSend:function(){
                    $.mobile.loading('show',{theme:"a",text:"Please wait...",textonly:true,textVisible:true});
                },
                complete:function(){
                    $.mobile.loading('hide');
                },
                success:function(result){
                    console.log(result);
                    if(result.status==true){
                        user.name=result.message;
                        window.localStorage.setItem('konfirmasi', JSON.stringify(result.data));
                        console.log('Kode: ', JSON.parse(window.localStorage['konfirmasi']));
                    var kode = JSON.parse(window.localStorage['konfirmasi']);
                    console.log('Array length: '+kode.length);
                        queryDB();
                        console.log('Login berhasil');
                        $.mobile.changePage("#konfirmasi");
                        window.localStorage.setItem('uname', un);
                        window.localStorage.setItem('passwd', pw);                        
                        console.log(window.localStorage['uname']);
                    }else{
                        alert('Login gagal. Username atau password tidak sesuai');
                    }
                },
                error:function(request,error){
                    alert('Koneksi error. Silahkan coba beberapa saat lagi!');
                }
            });
        }else{
            alert('Masukkan username dan password!');
        }
        return false;
    });
});

$(document).on('pagebeforeshow','#konfirmasi',function(){
    $.mobile.activePage.find('.welcome').html('<h3>Selamat Datang '+user.name+'</h3>' );
});

$(document).off('click').on('click','#logout',function(){
    window.localStorage.clear();
    dropDB();
    $.mobile.changePage("#home");
});

function exitFromApp(){
    navigator.app.exitApp();
}

那么,我是否使用了正确的注销脚本方式?我不知道它是否有效,因为我仍然无法尝试它,因为当我使用插入查询尝试时,登录脚本仍然出错。

有人可以帮我完成吗?

最佳答案

你从哪里调用这段代码?

function insertDB(tx,val){
            for (var i = kode.length - 1; i >= 0; i--) {
                tx.executeSql('INSERT INTO konfirmasi VALUES ('+a[i]+');',querySuccess,errorCB);
            };
        }

如果您从事务中调用它,则“val”参数不会直接传递给 insertDB 函数。您可以尝试以下操作:

val = [];
db.transaction(function(tx){
insertDB(tx, val);
}, errorCB);

此外,确保这些语句始终在 db.transaction 上下文中运行

玩得开心!

关于javascript - 手机间隙 : insert query sqlite when login success,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31083792/

相关文章:

javascript - 如何避免 Javascript 变量在页面刷新时被重置?

jquery - 根据复选框验证按钮

javascript - 如何使用样式表打印 iFrame?

javascript - 如何在 Keycloak 中实现组成员 JavaScript 策略

javascript - jquery click toggle - 单击另一个元素时关闭一个元素

android - 当用户在测验中对我的问题给出正确答案时,创建一个带有下一步按钮的弹出窗口

android - TCP 服务器接收数据的速度比发送数据的速度慢

javascript - 如何转义正则表达式中的特殊字符

javascript - JavaScript 中的 void、eval 和 Function 构造函数有什么区别?

android - 在 Ubuntu 17.04 上从 Android Studio 运行 AVD