我即将完成一个应用程序的创建,该应用程序消耗了REST API的数据。该应用程序与客户,订单和产品一起使用,将其从RET的API中带入并将其插入本地数据库(SQLITE)。
我需要知道存储数组中的数据的有效方法是什么?也就是说,第一次,它使我在数组中为我带来了48,000个客户。问题是,当您按项目插入项目时,应用程序会标记或需要很长时间才能这样做。
我需要知道什么是最有效的方法。
我说的是"仅第一次",因为基于最高等级,下一个同步,我从那时起就这样做(并且只会带来更新的或新的同步)。
查询是:
'INSERT OR REPLACE INTO orders (id, C_IDPEDIDO, N_NROPEDIDO, C_CLIENTE, N_NROAUTORIZACION, FH_AUTORIZACION, FH_BAJA, C_IDFACTNOTA, N_ESTADO, X_OBSERVACION, FH_INCORPORACION, ORA_ROWSCN, state, error) VALUES ((SELECT id FROM orders WHERE C_IDPEDIDO=?), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
,但是,正如我提到的,当一个一个一个一个插入时,或者被标记了很多。
返回"承诺"时,我等待着(结束)的这些查询,然后用"可观察到"
在这里,我浏览来自"客户:[]"
的Web服务的客户代码是:
let promises = [];
for(let key = 0; key < clients.length; key++) {
// Insertamos el cliente.
promises.push(this.SQLite_query('INSERT OR REPLACE INTO clients (id, C_CLIENTE, X_APELLIDOCLI, X_NOMBRES, X_DOMICCLI, X_LOCALIDAD, X_PROVINCIA, X_NROCUIT, X_CONDICIONIMP, ORA_ROWSCN) VALUES ((SELECT id FROM clients WHERE C_CLIENTE=?), ?, ?, ?, ?, ?, ?, ?, ?, ?)', [clients[key]['C_CLIENTE'], clients[key]['C_CLIENTE'], clients[key]['X_APELLIDOCLI'], clients[key]['X_NOMBRES'], clients[key]['X_DOMICCLI'], clients[key]['X_LOCALIDAD'], clients[key]['X_PROVINCIA'], clients[key]['X_NROCUIT'], clients[key]['X_CONDICIONIMP'], clients[key]['ORA_ROWSCN']]).then((data) => {
// "{"rows":{"length":0},"rowsAffected":1,"insertId":1}
if(data['rowsAffected']) {
// Si se insertó.
ret['inserted'].push(clients[key]['C_CLIENTE']);
} else {
// Si no se insertó, lo agregamos a los existentes.
ret['existents'].push(clients[key]['C_CLIENTE']);
}
}, (error) => {
// Si hubo un error, lo agregamos a errores.
ret['error'].push(clients[key]['C_CLIENTE']);
}));
}
Observable.forkJoin(promises).subscribe((data) => {
// When all the promises are over, we return the data.
resolve(ret)
});
请,我需要能够解决这个问题,因为我吃了时间。
我被困在那部分,这是我唯一无法完成它的部分。
当然,非常感谢大家!
看一下Cordova-sqlite-porter,特别是JSON导入优化的部分。
我创建了它是为了轻松从SQLite DB导入/导出数据,但除了优化JSON结构中大量记录的导入外。
通过使用此处描述的联合选择方法,我能够更快地进口。
您可以直接通过importjsontodb()。
直接使用插件。或使用将插入物批处理的相关代码来创建您自己的实现:
// Default maximum number of statements to use for batch inserts for bulk importing data via JSON.
var DEFAULT_BATCH_INSERT_SIZE = 250;
// Statement separator
var separator = ";n";
var mainSql = "";
var batchInsertSize = opts.batchInsertSize ? opts.batchInsertSize : DEFAULT_BATCH_INSERT_SIZE;
if(json.data.inserts){
for(var tableName in json.data.inserts){
var _count = 0;
for(var i=0; i<json.data.inserts[tableName].length; i++){
if(_count === batchInsertSize){
mainSql += separator;
_count = 0;
}
var _row = json.data.inserts[tableName][i];
var _fields = [];
var _values = [];
for(var col in _row){
_fields.push(col);
_values.push(sanitiseForSql(_row[col]));
}
if(_count === 0){
mainSql += "INSERT OR REPLACE INTO " + sqlEscape(tableName) + " SELECT";
for(var j = 0; j < _fields.length; j++){
if(typeof _values[j] === "undefined" || _values[j] === null || _values[j].toLowerCase() == 'null'){
mainSql += " NULL AS '" + _fields[j] + "'";
}else{
mainSql += " '" + _values[j] + "' AS '" + _fields[j] + "'";
}
if(j < _fields.length-1){
mainSql += ",";
}
}
}else{
mainSql += " UNION SELECT ";
for(var j = 0; j < _values.length; j++){
if(typeof _values[j] === "undefined" || _values[j] === null || _values[j].toLowerCase() == 'null'){
mainSql += " NULL";
}else{
mainSql += " '" + _values[j] + "'";
}
if(j < _values.length-1){
mainSql += ",";
}
}
}
_count++;
}
mainSql += separator;
}
}
/**
* Sanitises a value for insertion into a SQL statement.
* Replace occurrences of 1 single quote with 2 single quotes to SQL-escape them.
* @param {string} value - unsanitised value
* @returns {string} sanitised value
*/
function sanitiseForSql(value){
if (value === null || value === undefined) { return null; }
return (value+"").replace(/'/g,"''");
}
/**
* Escapes the given value if it contains special characters by wrapping it with back-ticks: value => `value`.
* @param {string} value - unescaped value
* @return {string} escaped value
*/
function sqlEscape(value){
if(value.match(/[_-]+/)){
value = '`' + value + '`';
}
return value;
}