在Angular app

时间:2015-11-08 14:02:42

标签: javascript json angularjs indexeddb dexie

我正在努力处理来自服务器的20-50k JSON对象响应,我应该将其插入到indexeddb数据存储区中。

使用foreach重复响应,并且每个行都添加每一行。响应少于10k行的呼叫工作正常,并在一分钟左右插入。但是当数量变大时,数据库会在一段时间后无响应并返回此错误消息

  

“db Error err =由于未知原因导致事务中止”

我正在为数据库使用Dexie包装器,并为dexie使用名为ngDexie的角度包装器。

var deferred = $q.defer();
var progress = 0;
 // make the call
 $http({
       method: 'GET',
       headers: headers,
       url: '/Program.API/api/items/getitems/' + user
            }).success(function (response) {

        // parse response
        var items = angular.fromJson(response);
        // loop each item
        angular.forEach(items, function (item) {    
                    // insert into db
                    ngDexie.put('stuff', item).then(function () {
                        progress++;
                        $ionicLoading.show({
                            content: 'Loading',
                            animation: 'fade-in',
                            template: 'Inserting items to db: ' + progress
                                       + '/' + items.length,
                            showBackdrop: true,
                            maxWidth: 200,
                            showDelay: 0

                        });

                        if (progress == items.length) {
                            setTimeout(function () {
                                $ionicLoading.hide();
                            }, 500);
                            deferred.resolve(items);

                        }      
                    });
                });
            }).error(function (error) {
                $log('something went wrong');
                $ionicLoading.hide();
            });
            return deferred.promise;

我是否有错误的方法处理一个块中的整个数据?有更好的选择吗?整个过程仅在用户打开网站时执行一次。非常感谢所有帮助。目标设备是使用Chrome运行Android的平板电脑。

3 个答案:

答案 0 :(得分:1)

由于您收到未知错误,因此I / O出现问题。我的猜测是下面的db有处理数据的麻烦。可以尝试分批分批,每个最多10k。

  

由于与特定IDBRequest无关的原因,事务可能会失败。例如,由于提交事务时出现IO错误,或者由于运行到配额限制,其中实现无法将超出配额的配置限制为部分请求。在这种情况下,实现必须使用事务作为事务和适当的错误类型作为错误来运行中止事务的步骤。例如,如果超出配额,则应将QuotaExceededError用作错误,如果发生IO错误,则应将UnknownError用作错误。

您可以在specs

中找到

另一种可能性是,您是否在objectstore上定义了任何索引?因为对于您拥有的每个索引,需要为每个插入维护该索引。

答案 1 :(得分:0)

如果您插入许多新记录,我建议使用添加。这是出于性能原因而添加的。请参阅此处的文档:

https://github.com/FlussoBV/NgDexie/wiki/ngDexie.add

答案 2 :(得分:0)

我遇到了大量批量插入(100.000 - 200.000条记录)的问题。我使用Dexie库中的bulkPut()解决了所有的IndexedDB性能问题。它有这个重要特征:

  

Dexie表现出色。这是大量的方法利用   indexedDB中一个不为人知的功能,可以存储   没有收听每个onsuccess事件的东西。这加速了   表现达到最大。

Dexie:https://github.com/dfahlander/Dexie.js

BulkPut() - > http://dexie.org/docs/Table/Table.bulkPut()