【问题标题】:How to access and update Sqlite db file stored locally[asset folder] in project file using cordova如何使用cordova访问和更新项目文件中本地存储的Sqlite db文件[资产文件夹]
【发布时间】:2016-04-21 21:01:11
【问题描述】:

我有一个sqlite db 文件存储在我的cordova 项目的assets 文件夹中,我想在我的应用程序中访问它并且还想更新数据库。

到目前为止,我查看了cordova sqlite plug-in,它可以创建一个sqlite db并对其进行更新,但不确定如何从cordova的资产文件夹中更新现有的db文件

这是我的以下代码:

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

    <script type="text/javascript" charset="utf-8" src="cordova-2.0.0.js"></script>
    <script type="text/javascript" charset="utf-8" src="index.js"></script>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="css/conf-room1.min.css" rel="stylesheet" />
    <link href="css/jquery.mobile.icons.min.css" rel="stylesheet" />
    <link href="css/jquery.mobile.structure-1.4.4.min.css" rel="stylesheet" />
    <link href="css/app.css" rel="stylesheet" />
    <link href="css/custom_color.css" rel="stylesheet" />
    <script src="js/jquery-2.1.3.min.js"></script>
    <script src="js/jquery.mobile-1.4.4.min.js"></script>
    <script src="cordova.js"></script>
    <script src="js/jquery-2.1.3.min.js"></script>
    <script src="js/jquery.mobile-1.4.4.min.js"></script>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>


    <script>

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

var db = "";

function populateDB(tx) {
    tx.executeSql('DROP TABLE IF EXISTS SoccerPlayer');
    tx.executeSql('CREATE TABLE IF NOT EXISTS SoccerPlayer (Name TEXT NOT NULL, Club TEXT NOT NULL)');
    tx.executeSql('INSERT INTO SoccerPlayer(Name,Club) VALUES ("Test1", "Team1")');
    tx.executeSql('INSERT INTO SoccerPlayer(Name,Club) VALUES ("Test2", "Team2")');
}

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


function querySuccess(tx,result){
        var playerlist = document.getElementById("SoccerPlayerList");
        var players = "";
        alert("The show is on");
        var len = result.rows.length;
        for (var i=0; i<len; i++){
            alert(result.rows.item(i).Name + result.rows.item(i).Club);
            players = players + '<li><a href="#"><p class="record">'+result.rows.item(i).Name+'</p><p class="small">Club '+result.rows.item(i).Club+'</p></a></li>';
        }

        playerlist.innerHTML = players;
        $("#SoccerPlayerList").listview("refresh");
}


function errorCB(err) {
    alert("Error processing SQL: "+err.code);
}


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


function onDeviceReady() {
    <!--db = window.openDatabase("SimpleTestOne", "1.0", "PhoneGap Demo", 200000);-->
   db =  window.openDatabase({name: "SimpleTestOne.db", createFromLocation: 1});
    db.transaction(populateDB, errorCB, successCB);
}
    </script>


</head>
<body>

<div data-role="page">
    <div data-role="header" data-position="fixed" data-theme="b">
        <h1>Soccer Player</h1>
    </div>
    <div data-role="content">
        <ul id="SoccerPlayerList">
        </ul>
    </div>
</div>
<!--end of Soccer Player Page--->
</body>
</html>

注意:我的资产文件夹中有 SimpleTestOne.db

【问题讨论】:

  • 您可以使用此路径file:///android_asset/www/DBFilePathHere 访问该数据库文件。但我建议您使用 SQLite 数据库创建并更新该 db 文件,并且无需安装插件就无需安装插件,您也可以使用它。
  • 感谢您的快速回答。您能提供一些代码示例如何更新该数据库记录
  • 您是否已经使用 SQLite DB 为您的应用创建了数据库,包括插入数据等?
  • 是的,我已经有一个使用 sqlite 浏览器创建的数据库。我只想访问数据库并使用一些查询对其进行更新。
  • 试试我的回答,如果您遇到任何问题,请告诉我。

标签: android cordova android-sqlite


【解决方案1】:

你可以试试下面Snippet.

This snippet contains all the part from Data base creation to Insert , Edit , Delete , Update and Display data 您的数据库。

注意:Change your Database name and Table name and Database fields here whatever you want to keep.

<script type="text/javascript" charset="utf-8">

        // Wait for Cordova to load
        //
        document.addEventListener("deviceready", onDeviceReady, false);

        var currentRow;
        // Populate the database
        //
        function populateDB(tx) {
            tx.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id INTEGER PRIMARY KEY AUTOINCREMENT, name,number)');
        }

        // Query the database
        //
        function queryDB(tx) {
            tx.executeSql('SELECT * FROM DEMO', [], querySuccess, errorCB);
        }

        function searchQueryDB(tx) {
            tx.executeSql("SELECT * FROM DEMO where name like ('%"+ document.getElementById("txtName").value + "%')",
                    [], querySuccess, errorCB);
        }
        // Query the success callback
        //
        function querySuccess(tx, results) {
            var tblText='<table id="t01"><tr><th>ID</th> <th>Name</th> <th>Number</th></tr>';
            var len = results.rows.length;
            for (var i = 0; i < len; i++) {
                var tmpArgs=results.rows.item(i).id + ",'" + results.rows.item(i).name
                        + "','" + results.rows.item(i).number+"'";
                tblText +='<tr onclick="goPopup('+ tmpArgs + ');"><td>' + results.rows.item(i).id +'</td><td>'
                        + results.rows.item(i).name +'</td><td>' + results.rows.item(i).number +'</td></tr>';
            }
            tblText +="</table>";
            document.getElementById("tblDiv").innerHTML =tblText;
        }

        //Delete query
        function deleteRow(tx) {
          tx.executeSql('DELETE FROM DEMO WHERE id = ' + currentRow, [], queryDB, errorCB);
        }

        // Transaction error callback
        //
        function errorCB(err) {
            alert("Error processing SQL: "+err.code);
        }

        // Transaction success callback
        //
        function successCB() {
            var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000);
            db.transaction(queryDB, errorCB);
        }

         // Cordova is ready
        //
        function onDeviceReady() {
            var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000);
            db.transaction(populateDB, errorCB, successCB);
        }

        //Insert query
        //
        function insertDB(tx) {
            tx.executeSql('INSERT INTO DEMO (name,number) VALUES ("' +document.getElementById("txtName").value
                    +'","'+document.getElementById("txtNumber").value+'")');
        }

        function goInsert() {
            var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000);
            db.transaction(insertDB, errorCB, successCB);
        }

        function goSearch() {
            var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000);
            db.transaction(searchQueryDB, errorCB);
        }

        function goDelete() {
             var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000);
             db.transaction(deleteRow, errorCB);
             document.getElementById('qrpopup').style.display='none';
        }

        //Show the popup after tapping a row in table
        //
        function goPopup(row,rowname,rownum) {
            currentRow=row;
            document.getElementById("qrpopup").style.display="block";
            document.getElementById("editNameBox").value = rowname;
            document.getElementById("editNumberBox").value = rownum;
        }

        function editRow(tx) {
            tx.executeSql('UPDATE DEMO SET name ="'+document.getElementById("editNameBox").value+
                    '", number= "'+document.getElementById("editNumberBox").value+ '" WHERE id = '
                    + currentRow, [], queryDB, errorCB);
        }
        function goEdit() {
            var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000);
            db.transaction(editRow, errorCB);
            document.getElementById('qrpopup').style.display='none';
        }

    </script>

I am using this code for one of my app and it's working fine.

编辑 1:

注意: Please place your db file in wwww directory like for e.g projectpath/www/dbname.db.

For accessing db file from asset folder.

window.openDatabase({name: "dbname.db", createFromLocation: 1}); 

编辑 2:

Just install below plugin in your app.

cordova plugin add https://github.com/brodysoft/Cordova-SQLitePlugin.git

And Try this.

 var db = window.sqlitePlugin.openDatabase({name: "my.db", createFromLocation: 1});

【讨论】:

  • @AbhijitChakra 你有没有在你的页面中添加任何 js 文件?像cordova.js等.....
  • 现在它正在工作,但它是在创建一个新的数据库还是从资产文件夹中的数据库文件中获取数据
  • 不,它会创建新的数据库。但是,如果您使用 ddms 将数据库文件推送到您的应用程序中,然后在此代码中传递该数据库名称,那么它将与它一起工作。
  • 你知道如何访问资产文件夹中的 db 文件吗?或者如何给出该 db 的路径以便它在代码中打开
  • @AbhijitChakra 兄弟你搞定了吗?让我知道。
猜你喜欢
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 2012-05-13
相关资源
最近更新 更多