android – 检查记录是否存在,如果存在则更新它,否则在PhoneGap中创建新记录?

我编写了一个代码,将记录的值插入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>

解决方法:

通常,您必须搜索记录:

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

当你得到结果时,检查你是否有东西,并相应地进行INSERT或UPDATE:

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]);
});

相关文章

SQLite架构简单,又有Json计算能力,有时会承担Json文件/RES...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器...
安卓开发,利用SQLite实现登陆注册功能