我正在使用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(标识符)函数调用中抛出错误。错误是:
TypeError:无法执行'交易'在'数据库'。作为参数1提供的回调不是函数。
我该如何实施此解决方案?或者,还有更好的方法?理想情况下,我也不想创建多个 insertSquareDB(tx)函数,例如insertCircleDB(tx),insertRundDB(tx)等。有没有一种方法可以定义1个动态插入值的函数,例如: (假设的)
function insertSquareDB(tx, tableName, columnName, optionValues)
{
tx.executeSql('INSERT OR IGNORE INTO tableName (columnName) VALUES ("' + optionValues + '" )');
}
答案 0 :(得分:1)
您不需要在事务中包装goInsert(identifier)调用:
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]);
});
}