2017-12-14 9 views
1

REST APIからデータを消費するAPPの作成をほぼ終了します。 このアプリケーションは、CLIENT、ORDERS、およびPRODUCTSと連携して、REST APIからそれらを呼び出し、それらをローカルデータベース(SQLite)に挿入します。角2(イオン性)SQLite一度に何千ものアイテムを挿入する

アレイに入ってくるデータを効率よく保存する方法が必要なのでしょうか? つまり、配列の配列内に48,000のクライアントを持って来るのは初めてです。 問題は、ITEMで項目を挿入すると、アプリケーションにラベルが付けられているか、または処理に時間がかかることです。

これを行う最も効率的な方法は何かを知る必要があります。

最高ランクに基づいて次回の同期をとるため、私はそれ以降に行います(更新されたものまたは新しいもののみを持ちます)。

'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=?), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); 

しかし、一つ一つを挿入するとき、私は、述べたように、またはそれがマークされているかがかかる:

クエリがあります。

「Observable.ForkJoin」と「約束」、私は(最後に)それらを待つこれらのクエリを返すと、私はすべて終了したときに、私は同期が私が来たクライアントを経るここ

を終え与えます「クライアント:[]」で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) 
}); 

私は私の時間を食べているので、私はそれを解決することができるようにする必要がありますしてください。

私はそれを完成させることができない唯一の部分で立ち往生しています。

もちろん、ありがとうございます!

答えて

0

cordova-sqlite-porter、具体的にはJSON import optimisationsのセクションをご覧ください。

SQLite DBからデータを簡単にインポート/エクスポートできるように作成しましたが、JSON構造から大量のレコードをインポートするのに最適です。

UNION SELECTメソッドdescribed hereを使用することで、インポートを100倍高速化できました。

importJsonToDb()で直接プラグインを使用できます。

それとも独自の実装を作成するためのINSERTをbatchesそのrelevant bit of codeを使用します。

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

は非常くらいありがとう!!!の私はそれを実装するつもりですし、私はあなたに教えてあげる! –

関連する問題