I have an application that works today 100% online, with data queries directly directed to an API itself.
I’m now implementing the ability to save offline queries in SQLite (with [SQLite] (http://ionicframework.com/docs/native/sqlite/)), so you can access them offline. Everything was being implemented perfectly, even trying to save a query that returns a lot of data, about 20,000 records. This generates in my application 20000 inserts to the database, which ended up causing the crash of my application for “Out of memory”, as I could see in the Android console.
I make the 20000 inserts in a single transaction, something like this:
this._http.get(url)
.map(res => <IndicadoresVendasOffline[]>res.json())
.catch((err) => {
console.error(err);
return Observable.throw(err);
}).subscribe((result: IndicadoresVendasOffline[]) => {
console.log(`Result test: ${result.length}`); // print: "Result test: 21657"
this.sqlDatabase.databaseInstance().then(database => {
database.transaction((transaction: SQLiteTransaction) => {
result.forEach(value => {
transaction.executeSql(`
INSERT INTO ${IndicadoresVendasOffline.name} (
id,
emissao,
lancamento,
previsaoEntrega,
cliente,
quantidadeTotal,
valorLiquido,
valorBruto
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
`,
[
value.id,
value.emissao,
value.lancamento,
value.previsaoEntrega,
value.cliente,
value.quantidadeTotal,
value.valorLiquido,
value.valorBruto
]
, () => {
console.log("Ok!");
}, this.sqlError
);
});
}).then(() => {
console.log("Transaction Ok!");
this.loading = false;
});
});
}, (err) => console.error(err));
How could I have this same behavior without causing “Out of memory” in my app?
Note: I have some limitations, such as: I can not split the request because it must represent the data at the time of the query, and if it splits into 2 or more queries, cross data can occur that does not represent the entire query result in the synchronization.