这是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 => {})
答案 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));
});
}