使用web数据库的Phonegap错误:"表达式mydb的结果.事务不是一个函数
Phonegap error using web database : "result of expression mydb.transaction is not a function"
我第一次尝试在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);
我希望这能澄清问题。另外,请记住,如果这回答了你的问题,请投票并将其标记为未来访问者参考的答案。
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 如何在JavaScript中将字符串转换为函数引用
- 用嵌套函数和默认函数定义函数
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- JQuery合并了keyup和focusout两个函数
- ES6构造函数返回基类的实例
- 监视函数从服务返回不起作用,但作用域函数起作用
- 我可以在json对象中添加一个函数吗
- AngularJS:我可以跳过函数参数回调吗
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- jquery点击函数select&取消选择
- 在websql事务完成后调用函数
- WebSQL事务成功't在JS回调函数中运行
- 如何在事务回调函数中传递参数
- 使用web数据库的Phonegap错误:"表达式mydb的结果.事务不是一个函数
- 如何传递参数到PhoneGap数据库事务函数