画布签名触摸在phonegap中产生问题

时间:2014-02-10 09:05:54

标签: javascript android sqlite jquery-mobile cordova

我发现了一些与“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);
    });

我为签名提供了sign plugin。现在我的问题是,当我输入签名字段时,不会插入数据库字段。此外,当我尝试删除符号插入查询并放置符号意味着另外两个表(成本和部分)值也未插入。如果我没有触摸符号字段,则插入toDataurl()格式的图像成功插入所有值。

我只在堆栈跟踪中遇到此错误:

sqlite (23) not authorised

请给出一些解决方法。

编辑: 我也试过这个:

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

2 个答案:

答案 0 :(得分:1)

嗯,它可以来自很多地方。

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

所以首先想我建议你做的是仔细检查你真的在kundensUnderSkrift中有一个字符串。

第2次有时WebSql可能会很棘手,所以为了安全起见,我会用它来创建表格:

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

WebSql更新似乎根本不起作用,因此请确保清除数据或卸载,而不是再次使用。

第3条您的陈述命令看起来不对:

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

应该是:

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

如果在检查了所有3个点之后它还没有工作,我建议尝试以下UGLY方法:

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手机除外,默认情况下不支持提醒)。

如果这有助于你,请告诉我。

答案 1 :(得分: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);
}