cordovaSQLite使用离子框架

时间:2015-05-06 02:21:14

标签: android angularjs sqlite ionic-framework ionic

我正在使用离子框架创建一个应用程序,我使用sqlite来存储大约150行的列表。每行都有两个属性,ID和Name。

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

它可以工作,但是当我在我的Galaxy Tab 3上测试它时,列表大约需要5-10秒才能加载,一旦它加载了列表,它就会超级滚动浏览列表项。

这是我的控制器

.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个虚拟对象(不调用db来获取数据),性能很好。这就是我认为这是SQLite性能问题的原因。这是我在这里的第一篇文章,如果我不够清楚就道歉。

2 个答案:

答案 0 :(得分:0)

您的问题可能来自几点。

你在Android上运行吗?

首先,如果您在Android上运行,请注意列表管理和滚动目前在离子上非常蹩脚。在我的情况下,只有Native scroll在保持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个col,(A和B),并且如果你只使用A来查询你的表,那么你只需要一个ColA索引,而IndexDefinition上面将等于:(A )

此外,检查officiel sqlite doc以了解如何管理索引: https://www.sqlite.org/lang_createindex.html

更新离子RC5

如果你还没有这样做,那就去做吧。 在1.0.0-rc5上滚动ng-repeat有很大的改进

<强>否则

如果这些信息不起作用,请提供有关您问题的更多信息: - 列表是不可滚动的吗?或在显示之前延迟很多?或两者兼而有之?

答案 1 :(得分:0)

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