2017-10-06 93 views
0

這是Ionic 2+ - 我加載時檢索對象的數組。當網絡存在並且用戶執行一個動作時,該對象itemID然後被髮送到該API端點。當沒有任何網絡時,應將itemID保存到SQLite數據庫,然後在網絡恢復後將其推送到API端點。當沒有網絡 - 保存數據到sqlite並一旦網絡重新獲得發送到服務器

組件

保存要保存到數據庫的初始對象數組。

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 => {}) 

回答

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)); 
     }); 
    } 
+0

我該如何獲得TABLE表名,如果它不是創造出來的?我應該早點這樣問。或者,我是否會從我的問題開始創建表格,並使用您在上面提供的示例? – userlkjsflkdsvm

+0

@userlkjsflkdsvm您應該首先創建表。我通常爲所有表使用單獨的服務/提供者。看例子http://www.tomislavstankovic.com/blog/ionic-2-3-sqlite-servis/ –

+0

我遇到的問題是,我只想保存一個對象,而不是一個數組。就像在我的例子中,我只向對象發送一個對象,而不是一個對象數組。 – userlkjsflkdsvm