我目前有一个尝试将数据插入表中的事务。如果数据已在表中,则会引发约束失败错误并运行选择以获取 ID。
t2.executeSql('INSERT INTO books (book) VALUES (?);',
[record],
function (t2, r) { // SQL_successfulCallback
record = r.insertId;
},
function (t2, err) { // SQL_errorCallback
if (err.message !== 'constraint failed') { // insert failed because of other
// reason - fail transaction
console.log('Insert SQL error ' + err.code + ' - ' + err.message + '.');
return true;
} else { // insert failed because data was already in the table
t2.executeSql('SELECT bookID FROM books WHERE book=?',
[record],
function (t, r) { // SQL_successfulCallback
record = r.rows.item(0).classificationID;
},
function (t, err) { // SQL_errorCallback
console.log('Lookup SQL error ' + err.code + ' - ' + err.message + '.');
return true;
}
);
return false;
}
}
);
我想加快处理速度,所以我想先看看数据是否在表中。如果不是,则将其插入...
t2.executeSql('SELECT bookID FROM books WHERE book=?',
[record],
function (t2, r) { // SQL_successfulCallback
if (r.rows.length !== 0) {
record = r.rows.item(0).bookID;
} else {
t2.executeSql('INSERT INTO books (book) VALUES (?);',
[record],
function(t2, r){ // SQL_successfulCallbac
record = r.insertId;
},
function (t2, err) { // SQL_errorCallback
if (err.message !== 'constraint failed') { // insert failed because of other
// reason - fail transaction
console.log('Insert SQL error ' + err.code + ' - ' + err.message + '.');
return true;
} else { // insert failed because data was already in the table
return false;
}
}
);
}
},
function (t, err) { // SQL_errorCallback
console.log('Lookup SQL error ' + err.code + ' - ' + err.message + '.');
return true;
}
);
...但是它不起作用。此事务运行所有选择然后执行插入。如何使第二种方法起作用?
最佳答案
我假设交易正在排队请求。所以你的队列看起来像这样
选择 1
选择 2
选择 3
然后当您在第一次调用后提交事务时看起来像这样。
选择 2
选择 3
插入 1
插入 2
插入 3
发生这种情况是因为调用插入的函数在选择运行后执行,并且直到事务提交但选择已经注册时才会发生。
为了让它成为
选择1
插入1
选择2
插入2
我会为每个选择语句创建一个单独的事务。
关于ios - 如果 select 返回 0 行插入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7949588/