phonegap sqlite没有找到这样的表

时间:2014-05-05 14:56:43

标签: android sqlite cordova

我正在使用Eclipse IDE中的Phonegap开发一个使用sqlite作为我的数据库的Android应用程序。 在我的index.html中,我使用db.openDatabase创建数据库。在数据> data> com.app> app_storage>下的文件资源管理器中创建数据库00001.db 在同一页面中,我创建了我的表(总共7个)并填充了其中一个。 当我导航到另一个页面并尝试查询表时,我在logCat中得到一个错误"没有这样的表" 为什么会这样?我该如何解决 ?

我看到SQLiteLog没有这样的表cdpportal_employee_details

          <!DOCTYPE html>
         <html>
     <head>



    <title>Embedded Sql Example</title>



    <script type="text/javascript" src="cordova.js"></script>
    <script type="text/javascript" src="jquery.min.js"></script>




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


        var db;
        var shortName = 'WebSqlDB';
        var version = '1.0';
        var displayName = 'WebSqlDB';
        var maxSize = 65535;
        role="false";

        function errorHandler(transaction, error) {
           alert('Error: ' + error.message + ' code: ' + error.code);
        }


        function successCallBack() {
           alert("DEBUGGING: success");
        }

        function nullHandler(){alert ("TABLE CREATED");}


        function onBodyLoad(){


            alert("DEBUGGING: we are in the onBodyLoad() function");

            if (!window.openDatabase) {

                alert('Databases are not supported in this browser.');
                return;
            }


            db = openDatabase(shortName, version, displayName,maxSize);

            db.transaction(function(tx){

            tx.executeSql( 'CREATE TABLE IF NOT EXISTS cdpportal_employee_details(employee_id TEXT PRIMARY KEY,password TEXT,role TEXT,employee_name TEXT,contact_number NUMBER,email_id TEXT)');
            tx.executeSql( 'CREATE TABLE IF NOT EXISTS cdpportal_course_details(course_id TEXT PRIMARY KEY NOT NULL,course_name TEXT NOT NULL,start_date TEXT NOT NULL,end_date TEXT NOT NULL,sess TEXT,instructor_name TEXT,techassociate_name TEXT,venue TEXT)');
            tx.executeSql( 'CREATE TABLE IF NOT EXISTS cdpportal_attendance_code_gen(course_id TEXT,day TEXT,attendance_code TEXT,FOREIGN KEY (course_id) REFERENCES cdpportal_course_details(course_id),PRIMARY KEY (course_id,day,attendance_code) )');
            tx.executeSql( 'CREATE TABLE IF NOT EXISTS cdpportal_registered_emp(employee_id TEXT ,course_id TEXT ,FOREIGN KEY (employee_id) REFERENCES cdpportal_employee_details(employee_id),FOREIGN KEY (course_id) REFERENCES cdpportal_course_details(course_id),PRIMARY KEY(employee_id, course_id))');
            tx.executeSql( 'CREATE TABLE IF NOT EXISTS cdpportal_removed_courses(admin_id TEXT,course_id TEXT,course_name TEXT,FOREIGN KEY (admin_id) REFERENCES cdpportal_employee_details(employee_id),FOREIGN KEY (course_id) REFERENCES cdpportal_course_details(course_id),PRIMARY KEY (admin_id, course_id))');
            tx.executeSql( 'CREATE TABLE IF NOT EXISTS cdpportal_attendance_record(employee_id TEXT,course_id TEXT,day TEXT,attended TEXT,FOREIGN KEY (employee_id) REFERENCES cdpportal_employee_details(employee_id),FOREIGN KEY (course_id) REFERENCES cdpportal_course_details(course_id),PRIMARY KEY (employee_id, course_id))');
            tx.executeSql( 'CREATE TABLE IF NOT EXISTS cdpportal_assesment_result(employee_id TEXT,course_id TEXT ,handson_marks NUMBER,objective_marks NUMBER,FOREIGN KEY (employee_id) REFERENCES cdpportal_employee_details(employee_id),FOREIGN KEY (course_id) REFERENCES cdpportal_course_details(course_id),PRIMARY KEY(course_id,employee_id))');
            tx.executeSql('insert into cdpportal_emploee_details values ("rifath","Qwerty","E","Sri Harsha L",9633852741,"sriharsha@infosys.com")');
            },nullHandler,successCallBack);


        }
function fun()
{

var uname=document.getElementById("usrnm").value;
var pwd=document.getElementById("pswd").value;
db = openDatabase(shortName, version, displayName,maxSize);
db.transaction(function(tx){
    tx.executeSql( 'SELECT role from cdpportal_employee_details where employee_id=? AND        password=?',[uname, pwd], function(tx, results)
    {
        role=results.value;

    }, null);
});
alert(role);

}


    </script>
</head>


<body onload="onBodyLoad()">

    <h1>WebSQL</h1>
    <form>
  <div>
      <h3>Login</h3>
      <label for="usrnm" class="ui-hidden-accessible">Username:</label>
      <input type="text" name="user" id="usrnm" placeholder="Username">
      <label for="pswd" class="ui-hidden-accessible">Password:</label>
      <input type="password" name="passw" id="pswd" placeholder="Password">
      <input type="submit" data-inline="true" value="Log in" onclick= fun() style="color : teal; background-color: #FFFFC0"> 
    </div>
 </form>

</body>

(1)没有这样的表:cdpportal_emploee_details

3 个答案:

答案 0 :(得分:0)

在继续提问之前,您确定使用的是sqlite database,请参阅phonegap文档

This API is based on the W3C Web SQL Database Specification and W3C Web Storage API Specification. Some devices already provide an implementation of this spec. For those devices, the built-in support is used instead of replacing it with PhoneGap's implementation. For devices that don't have storage support, PhoneGap's implementation should be compatible with the W3C specification.

更多详情here

AFAIK for sqlite你需要使用插件但是websql是phonegap原生支持的东西,所以,根据我的理解你使用的是web-sql而不是sqlite

现在,回答你的问题我不确定你是否面临我曾经遇到过的问题,这可能是错的但仍然,我遇到了同样的问题,实际上创建的数据库就像saldi.db.db而我正在寻找saldi.db这实际上创建了一个新数据库,因此您可以尝试清除此数据库/取消安装应用程序然后在触发任何查询之前检查此文件以保存或从表中获取数据只是确保正确的数据库是创建

欢呼声

答案 1 :(得分:0)

导航到该页面时,必须确保该表存在。那么看看你做了CREATE表IF NOT EXISTS语句的位置。

例如,如果create语句在函数内部,请检查该特定页面上是否已调用该函数。

编辑:我发现了你的问题:

tx.executeSql('insert into cdpportal_emploee_details values ("rifath","Qwerty","E","Sri Harsha L",9633852741,"sriharsha@infosys.com")');

你错过了cdpportal_emploee_details中的“y”

答案 2 :(得分:0)

我刚刚开始与jQuery,Cordova / PhoneGap和SQLite进行斗争,但有一种可能性就是你遇到了竞争条件。 SQLite插件在后台异步操作,因此您的页面可能会在这些事务完成之前加载。尝试在承诺中插入openDatabase来电,这样只有在您确定已创建后才能使用它。

function initDB()
{
    var promLoaded = $.Deferred() ; // creates a promise

    db = sqlitePlugin.openDatabase(/* your DB params; should be JSON obj for plugin */) ;
    db.transaction(
        function(tx) // initial transaction request
        { tx.executeSql(/* your CREATE TABLE statement */) ; }
        ,
        function(err) // error callback
        { console.log(err) ; } 
        ,
        function(tx,rs) // success callback
        { // chain a pre-population query off the success of the table creation
            db.transaction(
                function(tx)
                { tx.executeSql(/* INSERT statement to pre-populate data*/ ) ; }
                ,
                function(err)
                { console.log(err) ; }
                ,
                function(tx,rs)
                {
                    console.log( "Tables ready." ) ;
                    promLoaded.resolve() ; // promise resolves when stuff is complete
                }
            );
        }
    );

    return promLoaded.promise() ; // return the promise to the caller
}

使用此方案,您应该能够在initDB().done()执行后立即开始使用该表。

如果您通过此承诺,那么您可以稍后查看其状态并等待SELECT,直到您知道承诺已得到解决。

我自己刚刚开始学习这个,在我自己的应用程序中得到正确的结果,并且几乎没有开始测试它,所以我希望上面没有严重的错误。 YMMV。