Angular 2(离子)Sqlite一次插入数千个项目



我即将完成一个应用程序的创建,该应用程序消耗了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;
}

相关内容

  • 没有找到相关文章

最新更新