Android SQ Lite - 如何有效地一次插入超过 1000 行?

Android SQ Lite - How to insert more than 1000 rows at a time efficiently?

我正在使用离子框架。我想寻求有关如何一次插入超过 1000 行以及插入时向用户显示加载微调器的帮助,这样数据库中就不会出现任何混乱。

首先,我有两个services/factories。

数据库:

.factory('DB', function ($ionicPopup, $cordovaSQLite, $q, $ionicPlatform, $cordovaNetwork,$ionicLoading) {
        var self = this;
        self.query = function (query, parameters) {
            parameters = parameters || [];
            var q = $q.defer();
            $ionicPlatform.ready(function () {
                $cordovaSQLite.execute(db, query, parameters)
                    .then(function (result) {
                        console.log(result);
                        q.resolve(result);
                    }, function (error) {
                        console.log(error+"  .."+error.message);
                        alert('I found an error' + error.message);
                        q.reject(error);
                    });
            });
            return q.promise;
        }
        // Proces a result set
        self.getAll = function (result) {
            var output = [];

            for (var i = 0; i < result.rows.length; i++) {
                output.push(result.rows.item(i));
            }
            return output;
        }
        // Proces a single result
        self.getById = function (result) {
            var output = null;
            output = angular.copy(result.rows.item(0));
            return output;
        }
        return self;
    })

其次,用于从多个 url 下载数据的 AsyncService

.service('asyncService', function ($http, $q) {
        return {
            loadDataFromUrls: function (urls) {
                alert("I am inside new Service ");
                var deferred = $q.defer();
                var urlCalls = [];
                angular.forEach(urls, function (url) {
                    urlCalls.push($http.get(url.url));
                });
                // they may, in fact, all be done, but this
                // executes the callbacks in then, once they are
                // completely finished.
                $q.all(urlCalls)
                    .then(
                    function (results) {
                        deferred.resolve(results)
                    },
                    function (errors) {
                        console.log(errors);
                        deferred.reject(errors);
                    },
                    function (updates) {
                        console.log(updates);
                        deferred.update(updates);
                    });
                return deferred.promise;
            }
        };
    })

以及首先应该下载数据然后将它们插入到它们所属的表中的方法。

asyncService.loadDataFromUrls(urLs).then(function (result) {
                DB.query("DELETE FROM INV");
                // when i have to update the tables, i first delete them and then fill them back again.
                $ionicLoading.show({
                    template : 'Processing into Database. Please Wait...',
                    timeout : '6000'                      
                });
                result.forEach(function (rows) {
                    console.log(rows.config.url);
                    var i = 0;
                    if (rows.config.url == 'http://11.444.222.55:55/mobil_op?op=get_inv') {
                        rows.data.forEach(function (entry) {
                            var parameters = [entry.code, entry.name,];
                            DB.query("INSERT INTO INV (CODE,NAME,......) VALUES(?,?........)",parameters);
                        })
                    }
                })

            }, function (err) {
                alert("OOpsss ! : " + err.message);
                console.log("error");
            }, function (updates) {
                alert("updates");
                console.log("updates" + updates);
            })

向数组中插入 4453 个元素时应该如何操作?

db.executeSql("BEGIN TRANSACTION",{})
  .then(( res )=> { 
    console.log(res);
   // DO ALL INSERTION ON THE TABLES
   // e.g

    // AT LAST 
  db.executeSql("COMMIT",{})
    .then(()=> console.log("COMMIT")
    .catch(e => console.log(e));
    
  }).catch(e => console.log(e));

// This process provided me much more faster way . The method above in the question dialog was inserting 4553 items in 3 minutes on Asus Zenphone 1. This method let me insert 10000 items less then 3 minutes.