【问题标题】:cordovaSQLite retrieving data slowly using ionic frameworkcordovaSQLite 使用离子框架缓慢检索数据
【发布时间】:2015-05-06 19:28:05
【问题描述】:

我正在使用 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 性能问题。这是我在这里的第一篇文章,如果我不够清楚,请道歉。

【问题讨论】:

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

标签: android angularjs sqlite ionic-framework ionic


【解决方案1】:

好的,所以我在生成列表的模板中使用了 collection-repeat 而不是 ng-repeat。大大提高了榜单的表现。我希望这对某人有所帮助,因为它让我发疯了!

【讨论】:

  • 收集重复有负面影响(这是更快的方式)。这是一种数据绑定方式。这意味着它只创建了很少的 AngulaJS 观察者。如果您更新模型,您会注意到更改!因此,如果您知道以后不会更新模型,请仅使用 collection-repeat。
【解决方案2】:

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

您在 Android 上运行吗?

首先,如果您在 android 上运行,请注意列表管理和 SCROLLING 目前在 ionic 上非常糟糕。就我而言,只有原生滚动在保持 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),并且如果您只使用 A 来查询您的表,那么您只需要 ColA 上的一个索引,并且 IndexDefinition 以上将等于:(A )

此外,请查看官方 sqlite 文档以了解如何管理索引: https://www.sqlite.org/lang_createindex.html

更新到 ionic RC5

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

否则

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

【讨论】:

  • 感谢 aorfevre 的输入,我注意到 android 滚动不是那么好!但是,使用 collection-repeat 而不是 ng-repeat 就可以了。我将更新到 ionic RC5,原生滚动似乎也能更好地工作!
  • 我看到你使用收集重复。我也注意到它运行良好,但要小心收集重复是数据绑定的一种方式。如果您更新模型,您会注意到更改!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 2014-01-23
  • 1970-01-01
  • 2023-03-26
  • 2016-04-29
相关资源
最近更新 更多