Ionic 3插入了大量数据

时间:2017-07-22 07:41:52

标签: sqlite typescript ionic-framework insert ionic3

我有一个我正在开发的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));
  })        

}

有人知道我怎么能按时完成,我的意思是在结束时插入?

非常感谢!

2 个答案:

答案 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