我正在使用angularjs、monaca和onsenui构建一个跨平台应用程序。
我已经实现了一个sqlite数据库来保存数据,以便能够脱机工作。我的实现基于找到的答案HERE
我有一个视图,用户可以在其中选择任意数量的选项,然后这些选项值应该保存到sqlite数据库中。根据所选的选项值,每个选项值可以保存到同一个数据库表或单独的表中。
有了这个,我正试图重构我的insert语句,使它更有效,因为它可能被多次调用。在app.js控制器中,我有一个函数,它检查在视图中选择了哪个选项值,然后调用goinsert()函数将所选选项值插入sqlite数据库。下面是我的函数示例。

$scope.selectedIDOne = ""; // Variable to hold selected options value

$scope.changedValue = function (item, identifier) // item = selected option value; identifier = identifies table name to insert into
{
    switch (identifier)
    {
        case "Square":
            $scope.selectedIDOne = item;
            db.transaction(goInsert(identifier), errorCB, successCB); // Error on refactored goInsert(identifier) function trying to pass identifier
            break;

            default:
                // TODO
    }
}

然后在goinsert()函数中尝试以下操作。
function goInsert(identifier) // Error here
{
    switch (identifier)
    {
        case "Square":
            db.transaction(insertSquareDB, errorCB, successCB);
            break;
    }
}

function insertSquareDB(tx)
{
    tx.executeSql('INSERT OR IGNORE INTO tb_square (square_id) VALUES ("' + $scope.selectedIDOne + '" )');
}

当我运行代码时,我得到了一个错误,但是这个值仍然被插入到数据库中。在goinsert(identifier)函数调用时引发错误。错误是:
类型错误:无法对“数据库”执行“事务”。作为参数1提供的回调不是函数。
请告诉我如何实现这个解决方案?还是有更好的办法?理想情况下,我也不想创建多个insertsquaredb(tx)函数,例如insertcircledb(tx)、insertrounddb(tx)等。有没有一种方法可以定义一个函数来动态插入值,例如(假设的)
function insertSquareDB(tx, tableName, columnName, optionValues)
{
    tx.executeSql('INSERT OR IGNORE INTO tableName (columnName) VALUES ("' + optionValues + '" )');
}

最佳答案

不需要在事务中包装goinsert(标识符)调用:

switch (identifier)
{
  case "Square":
    $scope.selectedIDOne = item;
    goInsert(identifier);
    ...
}

如果希望能够调用一个函数向数据库中插入任何形状,最好的方法是动态生成SQL语句:
function insertShapeDB(shape, value)
{
  var tableName = '';
  var columnName = '';
  if (shape === 'Square') {
    tableName = 'tb_square';
    columnName = 'square_id';
  }
  else if (shape === 'Circle') {
    tableName = 'tb_circle';
    columnName = 'circle_id';
  }
  else if (shape === 'Round') {
    tableName = 'tb_round';
    columnName = 'round_id';
  }
  var sql = 'INSERT OR IGNORE INTO ' + tableName + ' (' + columnName + ') VALUES (?)';
  db.transaction(function(tx) {
      tx.executeSql(sql, [value]);
  });
}

09-27 03:31
查看更多