2015-05-06 32 views
0

我正在使用离子框架的应用程序,我正在使用sqlite来存储约150行的列表。每行有两个属性,ID和Name。cordovaSQLite缓慢检索数据使用离子框架

现在我正在使用运行查询的数据库工厂检索此数据。

它的工作原理,但是当我测试了我的Galaxy Tab的3名单上大约需要5-10秒加载,一旦它通过列表项加载列表它超级laggy滚动。

这里是我的控制器

.controller('ActionSearchCtrl', function($scope, ActionSearchDataService, DBA, $cordovaSQLite){ 

    var tablet = true; 
    var query = "select action FROM actions;"; 


    $scope.items = []; 

    $scope.runSQL = function(){ 
     DBA.query(query).then(function(result){ 
      $scope.items = DBA.getAll(result); 
     }); 
    }; 

    if(tablet){$scope.runSQL()}; 

这里是我的数据库厂

.factory('DBA', function($cordovaSQLite, $q, $ionicPlatform) { 
    var self = this; 

    // Handle query's and potential errors 
self.query = function (query, parameters) { 
    parameters = parameters || []; 
    var q = $q.defer(); 

    $ionicPlatform.ready(function() { 
     $cordovaSQLite.execute(herbsDatabase, query, parameters) 
     .then(function (result) { 
     q.resolve(result); 
     }, function (error) { 
     console.warn('I found an error'); 
     console.warn(error); 
     alert(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; 
}) 

因此,该查询返回约150项,我需要的一切在一个页面上(我看着无限滚动和分页但我的客户想要在一个页面上的所有项目,所以这不是一个选项。从我读过的内容来看,150个条目在观察者方面不应该太慢,因为我正在使用ng-repeat来显示列表项目。任何人都可以使用cordovaSQLite插件显示这些项目让列表功能更快让我知道!目前该列表几乎不可用,我也在其他设备上尝试过,结果相同。

我也试过在控制器创造约200虚拟对象(不打电话,到数据库获取数据)和性能优良。这就是为什么我认为这是SQLite性能问题。如果我不够清楚,这是我在这里的第一篇文章,非常抱歉。

+0

你可以尝试不使用插件? –

+0

没有这个插件是什么意思?我创建了不使用数据库的虚拟数据,并且工作正常。我不确定这是你的意思吗? –

回答

0

好的,所以我使用了collection-repeat而不是ng-repeat来重复生成列表的模板。大大提高了列表的性能。我希望这可以帮助别人,因为它让我疯狂!

+0

收集重复有下行效果(这是它的速度更快)。这是数据绑定的一种方式。这意味着它只创建极少数的AngulaJS Watcher。如果你更新你的模型,你会注意到通知变化! 如果您知道以后不更新模型,请仅使用collection-repeat。 – aorfevre

0

您的问题可能来自多个方面。

你在Android上运行?

首先,如果你正在运行在Android上,要知道,列表管理和滚动是目前对离子漂亮跛。就我的情况而言,只有Native滚动在保持ng-repeat的情况下提供了很好的结果。

app.config(function($ionicConfigProvider) { 
    if(ionic.Platform.isAndroid()) 
     $ionicConfigProvider.scrolling.jsScrolling(false); 
}); 

禁食了SQLite的

我已经清楚地定义与此命令正确指数提高了我的SQLite的性能:

'CREATE INDEX IF NOT EXISTS ' + _indexUniqueId + ' ON ' + _tableName + ' ' + IndexDefinition)); 

对于你的情况,如果你有2周的cols,( A和B),如果你只用在你的表中查询,则需要在可乐只有一个索引,以上IndexDefinition将等于:(A)

此外,检查OFFICIEL sqlite的文档,了解指数是如何管理: https://www.sqlite.org/lang_createindex.html

更新到离子RC5

如果你还没有做它,做它。 在1.0上滚动ng-repeat有巨大的改进。0-RC5

否则

如果这些信息不能正常工作,请提供您的问题的详细信息: - 在列表unscrollable?或者在显示之前拖延很多?或两者 ?

+0

感谢aorfevre的输入,我注意到android滚动并不是那么棒!但是,使用收集重复而不是ng-repeat做到了这一点。我会更新到离子RC5,本地滚动似乎也更好一些! –

+0

我看到你使用收集重复。我也注意到它运行良好,但要小心收集重复是单向数据绑定。如果你更新你的模型,你会注意到通知变化! – aorfevre