使用web数据库的Phonegap错误:"表达式mydb的结果.事务不是一个函数

Phonegap error using web database : "result of expression mydb.transaction is not a function"

本文关键字:事务 函数 一个 结果 表达式 错误 Phonegap 数据库 web 使用 quot      更新时间:2023-09-26

我第一次尝试在iOS应用中使用phonegap使用html5的web数据库。但是我被这个错误卡住了,它说"表达式mybd的结果"。事务不是函数"

如果我使用警报检查,initDB正在执行,但当涉及到createTables函数时,上述错误上升,我对此无能为力。

我已经使用了这个实现-> http://wiki.phonegap.com/w/page/16494756/Adding%20SQL%20Database%20support%20to%20your%20iPhone%20App

<script type="text/javascript">
    function validateFloat()
    {
        var mydb=false;
        var fuelUnits = document.myForm.UnitsOfFuel;
        var bFuelUnits = false;
        var bUnitPrice = false;
        switch (isNumeric(fuelUnits.value))
        {
            case true:
            bFuelUnits = true;
            fuelUnits.style.background="white";
            break;
            case false:
            fuelUnits.focus();
            fuelUnits.style.background="yellow";
            break;
        }
        var unitPrice = document.myForm.PricePerUnit;
        switch (isNumeric(unitPrice.value))
        {
            case true:
            bUnitPrice = true;
            unitPrice.style.background="white";
            break;
            case false:
            unitPrice.focus();
            unitPrice.style.background="yellow";
            break;
        }
        if(bFuelUnits && bUnitPrice)
        {
            if(initDB(mydb))
            {
                if(createTables(mydb))
                {   
                    loadCelebs();
                    return true;
                }
                else
                    return false;
            }
            else
                return false;
        }
        else
        {
            return false;
        }
    }
    function isNumeric(n)
    {
        var n2 = n;
        n = parseFloat(n);
        return (n!='NaN' && n2==n);
    }
    // initialise the database
    function initDB(mydb) 
    {
        try 
        { 
            if (!window.openDatabase) 
            { 
                alert('not supported'); 
                return false;
            } 
            else 
            { 
                var shortName = 'phonegap'; 
                var version = '1.0'; 
                var displayName = 'PhoneGap Test Database'; 
                var maxSize = 65536; // in bytes 
                mydb = openDatabase(shortName, version, displayName, maxSize);
                alert("initDB");
                return true;
            }
        } 
        catch(e) 
        { 
            // Error handling code goes here. 
            if (e == INVALID_STATE_ERR) 
            { 
                // Version number mismatch. 
                alert("Invalid database version."); 
                return false;
            } 
            else 
            { 
                alert("Unknown error "+e+"."); 
                return false;
            } 
            return true; 
        } 
    }
    // db error handler - prevents the rest of the transaction going ahead on failure
    function errorHandler(transaction, error) 
    { 
        alert("errorHandler");
        // returns true to rollback the transaction
        return true;  
    }
    // null db data handler
    function nullDataHandler(transaction, results) 
    { 
    } 
    // create tables for the database
    function createTables(mydb) 
    {
        try 
        {
            mydb.transaction(
                             function(tx) {
                             tx.executeSql('CREATE TABLE celebs(id INTEGER NOT NULL PRIMARY KEY, name TEXT NOT NULL DEFAULT "");', [], nullDataHandler(tx,results), errorHandler(tx,error)); 
                             tx.executeSql('insert into celebs (id,name) VALUES (1,"Kylie Minogue");', [], nullDataHandler(tx,results), errorHandler(tx,error)); 
                             tx.executeSql('insert into celebs (id,name) VALUES (2,"Keira Knightley");', [], nullDataHandler(tx,results), errorHandler(tx,error)); 
                             });
            alert("createTables");
            return true;
        } 
        catch(e) 
        {
            alert(e.message);
            return false;
        }
    }
    // load the currently selected icons
    function loadCelebs()
    {
        try 
        {
            mydb.transaction(
                function(tx) {
                tx.executeSql('SELECT * FROM celebs ORDER BY name',[], celebsDataHandler(tx,results), errorHandler(tx,error));
                });
        } 
        catch(e) 
        {
            alert(e.message);
        }
    } 

    // callback function to retrieve the data from the prefs table
    function celebsDataHandler(transaction, results) 
    {
        alert("here also?");
        // Handle the results 
        var html = "<ul>"; 
        for (var i=0; i<results.rows.length; i++) 
        { 
            var row = results.rows.item(i); 
            html += "<li>"+row['name']+"</li>'n";
        } 
        html +="</ul>";
        alert(html);
    }
</script>

您需要返回在initDB()函数中创建的新创建的mydb实例,然后使用返回的实例。

如果你要给传递给函数的参数重新赋一个新值(这就是你正在做的),它需要被返回,否则更改将会丢失。

请注意,如果你正在传递一个对象给函数(你没有这样做),你可以修改该对象的属性,这些更改将在该函数的作用域之外持久化。

function initDB(mydb) {
    mydb.initialized = true;
}
mydb.initialized = false;
initDB(mydb);
// mydb.initialized => true

vs…

function initDB(mydb) {
    mydb = new DB(); // new reference
    mydb.initialized = true;
}
mydb.initialized = false;
initDB(mydb);
// mydb.initialized => false

当然,你也传递了一个原始布尔值,而不是一个对象。原语是按值传递的,所以你必须返回新创建的mydb


您还错误地使用传入的事务处理程序。再次查看phone gap wiki,了解它们是如何将函数引用分配给变量并将这些引用传递给事务方法的。现在,您正在调用函数而不是传递它们。

所以,代替这个(你现在正在做的):

function errorHandler(tx, error) {
    alert("error");
    return true;  
}
function nullDataHandler(tx, results) { }
tx.executeSql('insert into celebs (id,name) VALUES (1,"Kylie Minogue");', [], nullDataHandler(tx, results), errorHandler(tx, error));

这样做:

var errorHandler = function (tx, error) {
    alert("error");
    return true;  
}
var nullDataHandler = function(tx, results) { }
tx.executeSql('insert into celebs (id,name) VALUES (1,"Kylie Minogue");', [], nullDataHandler, errorHandler);

我希望这能澄清问题。另外,请记住,如果这回答了你的问题,请投票并将其标记为未来访问者参考的答案。