iOSアプリケーションのphonegapを初めて使用するhtml5のWebデータベースを使用しようとしています。しかし、私はこのエラーで立ち往生しています "式の結果はmybd.transactionの結果は関数ではありません"Webデータベースを使用したPhoneGapエラー:「式mydb.transactionの結果が関数ではありません」
警告を使用してチェックすると、initDBが実行されますが、createTables関数になると、そこから無力です。私はこの実装を使用しました
<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'は何を返しますか? –
initDB()でBOOLを返していました。後で私は、mydb自体に更新されたデータベースオブジェクトを割り当てなければならないので間違いでした。データベース関連の関数から何も返さず、コードの一部を実行するように呼び出すだけで、すべてのソートが完了しました。 – ilight