我有一个我正在开发的ionic3应用程序的问题。 使用我的应用程序,我可以连接到JSON服务器并下载大量行,当我所有行都带有for时,在每行中调用funcion来插入数据。 但我认为,我的插入功能比插入功能更快,并且在结束前显示最终警报。这是我的代码:
private downloadRows()
{
this.platform.ready().then(()=>{
this.translateService.get('ACTUALIZANDOBARRANCOS').subscribe(
value => {
let loadingContent = value;
let loader = this.loadingController.create({
content: loadingContent,
spinner: "bubbles"
});
this.servicioDownloads.downloadAllRows().then(rows=> {
this.datosrows= rows;
loader.present();
for (var i = 0; i < this.datosrows.length; i++)
{
var datos = this.datosrows[i];
// we are going to insert rows
this.servicioDataBase.insertRow
( datos.indice,
datos.row1,
datos.row2,
datos.row3,
datos.row4,
datos.row5,
datos.row6,
datos.row7,
datos.row8,
datos.row9,
datos.row10,
//...
datos.row30
).catch(()=>{
console.log("da error");
});
}
loader.dismiss();
this.translateService.get('FINALIZADO').subscribe(
Titulo =>{
let titulo = Titulo;
this.translateService.get('BARRANCOSACTUALIZADOS').subscribe(
Descripcion =>{
let descripcion = Descripcion;
let alerta = this.alertCtrl.create({
title: titulo,
subTitle: descripcion,
buttons: ['OK']
})
alerta.present();
}
);
}
);
}).catch(error=>{
loader.dismiss();
this.translateService.get('ERROR').subscribe(
Titulo =>{
let titulo = Titulo;
this.translateService.get('ERRORDESCARGABARRANCOS').subscribe(
Descripcion =>{
let descripcion = Descripcion;
let alerta = this.alertCtrl.create({
title: titulo,
subTitle: descripcion,
buttons: ['OK']
})
alerta.present();
}
);
}
);
})
});
})
}
//这是插入服务
public insertRow( indice: any, row1: any, row2: any, row3: any, row4: any,
row5: any, row6: any, row7: any, row8: any, row9: any, row10: any,
row30: any)
{
let sql = "INSERT INTO TableRows (id,Nombre,Rio,Pais,Comunidad,
Zona,Localidad,Interes,Caracter,Cascada_max,Cuerda_max,Desnivel,
Longitud, Tiempo_aprox,Tiempo_descenso,Tiempo_retorno,Observaciones,
Descripcion_barranco,Periodo_optimo,Caudal,Caudal_filtro,Aproximacion,
Retorno,Loc_entrada_barranco,Loc_salida_barranco,Loc_entrada_parking,
Loc_salida_parking,Autor,Actualizacion,Idioma,Visible)
VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
console.log(sql);
return this.isReady()
.then(()=>{
return this.database.executeSql(sql,
[indice,BARRANCO, RIO, PAIS,COMUNIDAD,
ZONA,LOCALIDAD,INTERES,CARACTER, CASCADA_MAX,
CUERDA_MAX,DESNIVEL,LONGITUD,TIEMPO_APROX,
TIEMPO_DESCENSO,TIEMPO_RETORNO, OBSERVACIONES,
DESCRIPCION_BARRANCO,PERIODO_OPTIMO,CAUDAL,
CAUDAL_FILTRO,APROXIMACION, RETORNO,
LOC_ENTRADA_BARRANCO,LOC_SALIDA_BARRANCO,
LOC_ENTRADA_PARKING, LOC_SALIDA_PARKING,
AUTOR,actualización,idioma, visible]);
}).then((data)=>{
console.log("El insert devuelve esto " + JSON.stringify(data));
})
}
有人知道我怎么能按时完成,我的意思是在结束时插入?
非常感谢!
答案 0 :(得分:0)
只需在函数中使用async / await,它将允许您按顺序方式调用异步函数(因为Typescript 2.1您可以将异步/等待降级到ES3 / ES5)。因此,您的示例中的解决方案可能如下所示:
private downloadRows() { this.platform.ready().then(()=>{ this.translateService.get('ACTUALIZANDOBARRANCOS').subscribe( async value => { let loadingContent = value; let loader = this.loadingController.create({ content: loadingContent, spinner: "bubbles" }); let rows = await this.servicioDownloads.downloadAllRows(); loader.present(); for (let datos of rows) { // we are going to insert rows try { await this.servicioDataBase.insertRow ( datos.indice, datos.row1, datos.row2, datos.row3, datos.row4, datos.row5, datos.row6, datos.row7, datos.row8, datos.row9, datos.row10, //... datos.row30 ); } catch(error) { console.log(error); } } loader.dismiss(); this.translateService.get('FINALIZADO').subscribe( Titulo =>{ let titulo = Titulo; this.translateService.get('BARRANCOSACTUALIZADOS').subscribe( Descripcion =>{ let descripcion = Descripcion; let alerta = this.alertCtrl.create({ title: titulo, subTitle: descripcion, buttons: ['OK'] }) alerta.present(); } ); } ); }).catch(error=>{ loader.dismiss(); this.translateService.get('ERROR').subscribe( Titulo =>{ let titulo = Titulo; this.translateService.get('ERRORDESCARGABARRANCOS').subscribe( Descripcion =>{ let descripcion = Descripcion; let alerta = this.alertCtrl.create({ title: titulo, subTitle: descripcion, buttons: ['OK'] }) alerta.present(); } ); } ); }) }); })for循环中的
await
会阻止循环在插入实际完成之前完成。
答案 1 :(得分:0)
SQLite Porter - 此Cordova / Phonegap插件可用于使用SQL或JSON导入/导出SQLite数据库。
安装:
<script type="text/template" id="Blog_Post_Template">
@if(DescType == "FULL")
{
<text>${FDesc}</text>
}
...
</script>
用法:
$ ionic cordova plugin add uk.co.workingedge.cordova.plugin.sqliteporter
$ npm install --save @ionic-native/sqlite-porter
您可以尝试使用cordova-sqlite-porter。把你的插页传递给 使用importJsonToDb()的JSON结构,它将optimise the insertion放入SQLite DB。
example project说明插入了15,000多条记录。上 三星Galaxy S4,使用单个SQL插件执行此操作 语句大约需要5分钟/ 300秒,但优化的JSON 等效(使用UNION SELECT - see here for info) 在同一设备上3秒 - 快100倍。 - source