2011-09-25 3 views
0

iOSアプリケーションのphonegapを初めて使用するhtml5のWebデータベースを使用しようとしています。しかし、私はこのエラーで立ち往生しています "式の結果はmybd.transactionの結果は関数ではありません"Webデータベースを使用したPhoneGapエラー:「式mydb.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> 
+0

'initDB'は何を返しますか? –

+0

initDB()でBOOLを返していました。後で私は、mydb自体に更新されたデータベースオブジェクトを割り当てなければならないので間違いでした。データベース関連の関数から何も返さず、コードの一部を実行するように呼び出すだけで、すべてのソートが完了しました。 – ilight

答えて

2

あなたはinitDB()関数内で作成され、新しく作成されたmydbインスタンスを返した後、返されたインスタンスを使用する必要があります。

関数に渡されるパラメータに新しい値を再割り当てする場合は、それを返す必要があります。そうしないと、変更が失われます。

オブジェクトを関数に渡す場合(実行していない場合)、そのオブジェクトのプロパティを変更することができ、それらの変更はその関数のスコープ外で保持されます。

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

対...

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

もちろん、あなたも原始的なブール値ではなく、オブジェクトに渡しています。プリミティブは値によって渡されるため、新しく作成されたmydbを返す必要があります。


UPDATE

また、間違ったあなたの渡されたトランザクション・ハンドラを使用しています。関数の参照をどのように変数に代入し、それらの参照をトランザクションメソッドに渡すかについては、phone gap wikiをもう一度見てください。今のように、関数を渡す代わりに関数を呼び出すことになります。代わりに、この(あなたが今何をしているか)のだから、

、:私は、これはそれをクリア願ってい

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

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

は、これを行います。また、これがあなたの質問に答えた場合は、それをupvoteし、将来の訪問者への参照のための答えとしてそれをマークすることを忘れないでください。

+0

こんにちは、ありがとう。それは働いたが、データベースから選択した後にどのように結果セットを表示できますか?選択されたクエリが実行された後、celebsDataHandler()が呼び出されません。明示的にもそれを呼び出すことを試みましたが、まだ使用していません。何か提案してください? – ilight

+1

私の更新を見てください。 –

+0

私のところでは、ハンドラの名前をランダムに変更して、ローカルスコープを取得できると思っていたのは悪いです。しかし、私は完全に間違っていて、あなたの助けにたくさん感謝しています。私は今、私のアプリを正常に終了しました:) – ilight

関連する問題