没有网络时 - 将数据保存到sqlite并在网络重新获得后发送到服务器

时间:2017-10-06 05:06:58

标签: sqlite cordova ionic-framework ionic2 ionic3

这是Ionic 2+ - 我在加载时检索一个对象数组。当网络存在且用户执行操作时,该对象itemID随后被发送到该API端点。如果没有任何网络,则应将itemID保存到SQLite DB,然后在网络恢复后将其推送到API端点。

组件

保存初始对象数组以保存到db。

private createDB(): void{  
      this.sqlite.create({
        name: 'DATABASE_FILE_NAME',
        location: 'default'
      }).then((db: SQLiteObject) => {
          this.db = db;
          this.createTables();
        })
        .catch(e => console.log(e));
      }

      private createTables(): void{
        this.db.executeSql('CREATE TABLE IF NOT EXISTS "ITEMS" ( `rowid` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `something` BOOL, `something` BOOL, `itemID` INT )', {}).then((res) => { console.log(res, 'Executed SQL')
          }).catch(e => console.log(e));

      }

我正在检索的数组

[
    {itemID: 10, something: "blue", something: "1"}
    {itemID: 11, something: "red", something: "2"}
    {itemID: 12, something: "green", something: "2"}
    {itemID: 13, something: "yellow", something: "1"}
]

将动作功能发送到服务器

 this.service.sendAction(itemID).subscribe(result => {})

1 个答案:

答案 0 :(得分:2)

即使存在网络连接,您也可以将数据保存到 SQLite ,然后将其发送到API。在这种情况下,您可以在第一步中仅使用else中的州议员。

以下是您正在寻找的方案。

1。)将数据保存到SQLite( page.ts

callApi(){
  if(this._connectivityService.isOnline()){
  this.service.sendAction(itemID).subscribe(result => {})
  } else {
  this._databaseService.sendAction(itemID).then(result => {})
  }
}

2.。)下一步可以在仪表板或主页上,在那里您将检查网络连接并在网络存在时将数据从SQLite发送到API。 (的 dashboard.ts

ionViewDidEnter(){
     this.sendData();
 }

将数据从SQLite发送到API的函数。

sendData(){
    this.count = 0;
    this._database.getLocalData().then((result) => {
        this.DataList = <Array<Object>> result;
        if(this.DataList.length !== 0){
          this.DataList.forEach(function(item) {
            this.service.sendAction(item).subscribe(result => {
            if(res.status == "ok" && this.count == this.DataList.length-1){ 
               //empty SQLite local table if success
                this._database.deleteLocalData();
             }
            })
           }
        } else {
          //       
        } 
    }, (error) => {
            console.log("Offline data not sent!", 
      error);
    });
  }

以下是存储数据的SQLite表示例。 (的数据库service.ts

public getLocalData() {
        return new Promise((resolve, reject) => {
        this.sqlite.create({
        name: 'dbName.db',
        location: 'default'
        })
        .then((db: SQLiteObject) => {
            db.executeSql("SELECT * FROM tableName", []).then((data) => {
                let DataList = [];
                if(data.rows.length > 0) {
                    for(let i = 0; i < data.rows.length; i++) {
                       DataList.push({
                            itemID: data.rows.item(i).itemID,
                            something: data.rows.item(i).something
                        });
                    }
                }
                resolve(DataList);
            }, (error) => {
                reject(error);
            });
            })
         .catch(e => console.log(e));
        });
    }