Ошибка телефонной связи при использовании веб-базы данных: «результат выражения mydb.transaction не является функцией» - PullRequest
0 голосов
/ 26 сентября 2011

Я пытаюсь использовать веб-базу данных html5, используя phonegap для приложения iOS.Но я застрял в этой ошибке, которая говорит: «результат выражения mybd.transaction не является функцией»

Если я проверяю с помощью предупреждений, 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>

1 Ответ

2 голосов
/ 26 сентября 2011

Вам необходимо вернуть только что созданный экземпляр mydb, созданный в функции initDB(), а затем использовать возвращенный экземпляр.

Если вы переназначаете новое значение параметру, который передается вфункция (это то, что вы делаете), она должна быть возвращена или изменения будут потеряны.

Обратите внимание, что если вы передаете объект функции (что вы не делаете), выможно изменить свойства этого объекта, и эти изменения будут сохранены вне области действия этой функции.

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.


ОБНОВЛЕНИЕ

Вы также неправильно используете обработчики переданных транзакций.Посмотрите на телефонную вики еще раз, чтобы увидеть, как они присваивают ссылки на функции переменным и передают эти ссылки в методы транзакции.Как и сейчас, вы вызываете функции вместо того, чтобы передавать их.

Итак, вместо этого (что вы делаете сейчас):

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

Надеюсь, это прояснит ситуацию.Кроме того, помните, если это ответило на ваш вопрос, поставьте ему оценку и отметьте его как ответ для ссылки на будущих посетителей.

...