【问题标题】:Check whether a record exists or not, if it exists update it else create new one in PhoneGap?检查记录是否存在,如果存在则更新它是否在PhoneGap中创建新记录?
【发布时间】:2012-10-09 21:22:53
【问题描述】:

我编写了一个代码,将记录的值插入 SQLite 数据库并显示它。

现在我要做的是检查我插入的记录是否存在?

如果记录存在,则更新它,否则创建一个新记录。

我如何在 PhoneGap 中做到这一点?以下是我尝试过的代码:

<!DOCTYPE html>
<html>
    <head>
        <title>Contact Example</title>

        <script type="text/javascript" charset="utf-8" src="cordova-1.5.0.js"></script>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
        <script type="text/javascript" charset="utf-8">

            //add listener when device ready
            document.addEventListener("deviceready", onDeviceReady, false);
            var db = window.openDatabase("Dummy_DB", "1.0", "Just a Dummy DB", 200000); //will create database Dummy_DB or open it

            //function will be called when device ready
            function insertdata(){
                //alert("hi");
                var name = $('#name').val();
                var passwd = $('#pwd').val();

                if(name == "")
                {
                    alert("Please enter name");
                }

                if(passwd == "")
                {
                    alert("Please enter Password");
                }
                if(name != "" && passwd != ""){
                db.transaction(populateDB, errorCB, successCB);
                }
            }

            function onDeviceReady(){
                document.getElementById("submit").addEventListener("click", insertdata, false);

            }

            //create table and insert some record
            function populateDB(tx) {
                tx.executeSql('CREATE TABLE IF NOT EXISTS Login (id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT NOT NULL, Password TEXT NOT NULL)');
                //tx.executeSql('INSERT INTO SoccerPlayer(Name,Club) VALUES ("Alexandre Pato", "AC Milan")');
               // tx.executeSql('INSERT INTO SoccerPlayer(Name,Club) VALUES ("Van Persie", "Arsenal")');
                //tx.executeSql('DELETE FROM SoccerPlayer');
                var name = $('#name').val();
                var passwd = $('#pwd').val();



                tx.executeSql('INSERT INTO Login (Name,Password) VALUES ("'+name+'","'+ passwd +'")');
                $('#name').val('');
                $('#pwd').val('');

            }

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

            //function will be called when process succeed
            function successCB() {
                alert("success!");
                db.transaction(queryDB,errorCB);
            }

            //select all from SoccerPlayer
            function queryDB(tx){
                tx.executeSql('SELECT * FROM Login',[],querySuccess,errorCB);
            }


            function querySuccess(tx,result){
                $('#SoccerPlayerList').empty();
                $.each(result.rows,function(index){
                       var row = result.rows.item(index);
                       $('#SoccerPlayerList').append('<li><a href="#"><h3 class="ui-li-heading">'+row['Name']+'</h3></a></li>');
                       });

                $('#SoccerPlayerList').listview();
            }


            </script>
    </head>
    <body>
        <div data-role="page">
                  <div data-role="header" data-position="fixed" data-theme="b">
                    <h1>Login</h1>
                  </div>
            <div>Name: <input type="text" id="name"></div>
            <div>Password: <input type="password" id="pwd"></div>
            <input type="submit" id="submit">
              <div data-role="content">
                     <ul id="SoccerPlayerList">
                            </ul>
                      </div>
                </div>
    </body>
</html>

【问题讨论】:

  • 任何人都可以回复,因为我不知道如何检查记录...拜托..

标签: android sqlite cordova crud


【解决方案1】:

一般情况下,你必须搜索记录:

SELECT 1 FROM Login WHERE Name = '...'

当你得到结果时,检查你是否得到了什么,并相应地执行INSERTUPDATE

INSERT INTO Login(Name, Password) VALUES('...', '...')
-- or
UPDATE Login SET Password = '...' WHERE Name = '...'

但是,SQLite 有一个扩展,允许您在插入记录时替换记录,否则会产生冲突。这要求您有一个UNIQUE 约束,以便可以检测到冲突:

CREATE TABLE Login(..., Name TEXT NOT NULL UNIQUE, ...)

然后,您可以使用以下命令:

INSERT OR REPLACE INTO Login(Name, Password) VALUES('...', '...')

请注意,切勿尝试将字符串直接放入 SQL 命令以避免格式问题(如果密码包含"?)和SQL injection 攻击 - 当Bobby Tables 尝试使用您的应用程序时会发生什么? 相反,使用参数;像这样:

db.transaction(function(tx) {
    var name = ...;
    var passwd = ...;
    tx.executeSql('INSERT OR REPLACE INTO Login(Name, Password) VALUES(?, ?)',
                  [name, passwd]);
});

【讨论】:

    猜你喜欢
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    相关资源
    最近更新 更多