Comment puis-je faire de tx.executeSql (SQL, [], (tx, results) une fonction de synchronisation avec sync / await?
Je veux en faire quelques-unes comme ceci: p>
tx.executesql est asynchrone donc mon closeDB () ( closeDatabase () ) ne fonctionne pas car la transaction est en cours.
C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:22 COMIENZA insertarDatos C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:88 Comienza Transaction C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:88 antes de excute i es: 0 C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:88 antes de excute i es: 1 C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:88 antes de excute i es: 2 C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:88 antes de excute i es: 3 C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:90 termina transaccion C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:112 TERMINA insertarDatos C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:128 Cerrando database ... C:\Users\josen\React-Projects\Ges\src\Screen\DrawerScreens\index.js:7 cannot close: transaction is in progress C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:91 dentro de executesql i es: 0 C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:93 ¡Datos insertados en BD! C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:91 dentro de executesql i es: 1 C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:93 ¡Datos insertados en BD! C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:91 dentro de executesql i es: 2 C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:93 ¡Datos insertados en BD! C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:91 dentro de executesql i es: 3 C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:93 ¡Datos insertados en BD!
mais cela ne fonctionne pas.
(voir les sorties)
Voici l'avertissement que j'ai reçu à la fin de la sortie: p>
insertarDatos = async () =>{
console.log('COMIENZA insertarDatos');
await db.transaction((tx) => {
console.log('Comienza Transaction');
for(let i in this.state.dataUsuarios){
const sql = `INSERT INTO usuarios VALUES (
'${this.state.dataUsuarios[i].id}',
'${this.state.dataUsuarios[i].nombre}',
'${this.state.dataUsuarios[i].usuario}',
'${this.state.dataUsuarios[i].password}',
'${this.state.dataUsuarios[i].grupo}',
'${this.state.dataUsuarios[i].faenas}'
)`;
console.log('antes de excute i es: ' + i);
tx.executeSql(sql, [], (tx, results) => {
console.log('dentro de executesql i es: ' + i);
if(results.rowsAffected > 0){
console.log('¡Datos insertados en BD!');
}else{
console.log('¡No se puedieron insertar datos en la BD!');
}(error) => {
console.log(error.message);
}
});
}
console.log('termina transaccion');
});
console.log('TERMINA insertarDatos');
}
async componentDidMount() {
console.log('*COMIENZA componentDidMount');
await this.consultarBD();
await this.openBD();
console.log('DataUsuarios es: ' + this.state.dataUsuarios);
await this.insertarDatos();
await this.closeDatabase();
console.log('*TERMINA componentDidMount');
}
C:\...name of proyect\node_modules\react-native\Libraries\Components\ScrollView\InternalScrollViewType.js:46 Possible Unhandled Promise Rejection (id: 0):
TypeError: error is not a function
TypeError: error is not a function
at SQLitePlugin.close (blob:http://localhost:8081/7a5bb020-64e9-41f5-a654-e50e6b9f5827:93749:9)
at _callee4$ (blob:http://localhost:8081/7a5bb020-64e9-41f5-a654-e50e6b9f5827:92942:54)
at tryCatch (blob:http://localhost:8081/7a5bb020-64e9-41f5-a654-e50e6b9f5827:23006:19)
.
.
.
.
Sorties:
await tx.executeSql(sql, [], (tx, results)
3 Réponses :
Essayez de l'implémenter comme ceci, en l'enveloppant dans une promesse, vous devriez pouvoir appeler cette fonction avec un await
await asyncForEach(userlist, async (user, index) => {
// do something with user and index
// you can use await here
})
Maintenant, si cela ne fonctionne pas ' t fonctionne, cela peut être un problème avec votre forin . Si tel est le cas, il peut être utile de consulter ce message . Il a une implémentation native d'un async foreach, qui pourrait être implémenté comme suit:
insertarDatos = () => {
return new Promise((resolve, reject) => {
db.transaction((tx) => {
try {
/* Successful transaction */
/* Make sure to call resolve when the transaction has finished
*/
resolve()
} catch (error) {
/* Failed transaction */
// if you reject any eventual errors, you can catch them when calling the function insertarDatos
reject(error)
}
});
})
}
J'aime cette réponse. Vous donne un contrôle total. Et c'est simple
La méthode async / wait pour rendre executeSql():
async function example() {
let db = await SQLite.openDatabase(
database_name,
database_version,
database_displayname,
database_size
);
await db.transaction(async tx => {
var [tx, results] = await tx.executeSql("SELECT * from TableName;");
var row = results.rows.item(0); //get the first row assumed existed.
});
await db.close();
}
C'est une réponse concise mais je vois que vous avez dû utiliser deux déclarations var à la place, let ou const. J'ai essayé de changer cela mais Typescript s'est plaint à ce sujet. Je vois que vous avez utilisé let plus haut. Il est vraiment difficile de faire fonctionner async / await avec sqLite et de le comprendre. Surtout la raison du tableau [tx, results]. Je ne peux pas comprendre la raison pour laquelle tx apparaît là-bas.
@mwarren, tx est là parce que executeSql est une méthode asynchrone, peut-être que quelque part, vous avez encore besoin du tx pour exécuter un autre SQL.
async getSqlitedata(): {
const data = await dbconn.executeSql("SELECT * from TableName;",[]);
if (data.rows.lenth >0) {
console.log(data.rows);
}
}
it will return a object {rows: {â¦}, rowsAffected: 0, insertId: undefined}