Canvas签名触摸在PhoneGap中出现问题

30

我找到了一些有关“phonegap canvas signature”的帖子,但它们并没有帮助我。我有一些下拉框、文本框和一个签名字段。我想把这些字段插入sqlite数据库中。

我的数据库表创建如下:

tx.executeSql("CREATE TABLE IF NOT EXISTS parts(id INTEGER PRIMARY KEY AUTOINCREMENT,nr,productId,description,toolsVerified)");
tx.executeSql("CREATE TABLE IF NOT EXISTS costs(id INTEGER PRIMARY KEY AUTOINCREMENT,nr,date,starttime,endtime,reason,cost)");
tx.executeSql("CREATE TABLE IF NOT EXISTS sign(orderNr unique ,rapport,sign)");

对于文本字段,像往常一样读取字段值。 对于画布签名字段,则需使用下拉列表。

kundusSign = $("#mKundusskirt")[0];
kundensUnderSkrift = kundusSign.toDataURL();

这是插入数据的代码:

db
    .transaction(function(tx) {
        // for parts table
        tx
                .executeSql(
                        "insert into parts(nr,productid,description,toolsVerified) values(?,?,?,?)",
                        [ nr, productId, desc, tool ]);
        // for cost table
        tx
                .executeSql(
                        "insert into costs(nr,date,starttime,endtime,reason,cost) values (?,?,?,?,?,?)",
                        [ nr, date, startTime, endTime, reason, cost ]);

        // for sign table
        signQuery = 'UNION SELECT ' + nr + ", '" + rapport + "','"
                + kundensUnderSkrift + "'";
        tx
                .executeSql('insert or replace into "sign" SELECT "orderNr","rapport","sign"'
                        + signQuery);
    });

我为签名包含了签名插件。现在我的问题是,当我在签名栏中输入时,数据库字段未被插入。当我尝试移除插入查询并将签名更改为其他两个表(成本和零件)的值也未被插入。如果我不触及签名字段,则所有值都会成功插入,对于图像,它会以toDataurl()格式进行插入。

我只在堆栈跟踪中收到这个错误:

sqlite(23)未授权

请给出一些解决方案。

编辑: 我也尝试了这个:

tx.executeSql("insert into sign(orderNr,sign,rapport)values(?,?,?)",[nr,rapport,kundensUnderSkrift]);

也许这个问题可以帮到你:http://stackoverflow.com/q/17550272/1741542 - Olaf Dietsche
2个回答

1

你应该在transaction()executeSql()方法中传递错误回调函数,这将有助于在开发过程中调试数据库操作。在生产环境中,你需要使用其他方式处理错误,而不是alert()

db.transaction(function(tx) {
    // for parts table
    tx.executeSql(
        "insert into parts(nr,productid,description,toolsVerified) values(?,?,?,?)",
        [ nr, productId, desc, tool ],
        null, sqlError
    );

    // for cost table
    tx.executeSql(
        "insert into costs(nr,date,starttime,endtime,reason,cost) values (?,?,?,?,?,?)",
        [ nr, date, startTime, endTime, reason, cost ],
        null, sqlError
    );

    // for sign table
    tx.executeSql(
        'insert or replace into sign(orderNr,rapport,sign) values (?,?,?)'
        [nr, rapport, kundensUnderSkrift],
        null, sqlError
        );
}, xactError);

function sqlError(tx, err) {
    alert("Statement failed: " + err.message);
}

function xactError(err) {
    alert("Transaction failed: " + err.message);
}

我解决了我的问题...错误处理不是问题。感谢您的建议。 - Aravin
最终是什么导致了问题?您可以添加一个答案并将其标记为已接受。 - Stepan Riha
签名需要太长时间来读取。在插入后加载新页面,因此会创建错误。因此,我编写了setTimeout函数来重定向页面。 - Aravin

1

好的,它可以来自许多地方。

首先,您是在Android(2.3或更低版本)上进行测试吗?如果是这样,那么问题很可能是.toDataUrl()不受Android默认浏览器支持,这意味着它在PhoneGap中也无法工作。

因此,我建议您首先仔细检查kundensUnderSkrift中是否真的有一个字符串。

其次,有时WebSql可能会很棘手,为了保险起见,我将使用以下内容创建表:

tx.executeSql("CREATE TABLE IF NOT EXISTS sign(orderNr unique ,rapport,sign STRING)");

WebSql 的更新似乎完全不起作用,因此请确保您清除数据或卸载应用程序,然后再试一次。

第三,您的语句顺序看起来有误:

tx.executeSql("insert into sign(orderNr,sign,rapport)values(?,?,?)",[nr,rapport,kundensUnderSkrift]);

应该是:

tx.executeSql("insert into sign(orderNr,rapport,sign)values(?,?,?)",[nr,rapport,kundensUnderSkrift]);

如果检查了所有三个点后仍然无法工作,我建议尝试以下丑陋的方法:
tx.executeSql("insert into sign(orderNr,sign,rapport) values('"+nr+"','"+ kundensUnderSkrift+"','"+rapport+"');",[],function(tx,success){alert("ALL OK");},function(tx,error){alert(error.message);});

你可以使用console.log而不是alert,但在移动设备上,我发现使用alert进行调试更容易(除了Windows手机,因为默认情况下不支持alert)。


我正在使用最新的Android版本,而不是2.3,并且“插入或替换”查询在我的另一个页面中正常工作,而且“kundensUnderSkrift”仅返回字符串值。感谢您的建议。 - Aravin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接