cordovaSQLite 使用离子框架缓慢检索数据
cordovaSQLite retrieving data slowly using 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;
})
所以查询 returns 大约 150 个条目,我需要在一页上全部显示(我研究了无限滚动和分页,但我的客户想要在一页上显示所有条目,所以这不是一个选项。从我读过的内容来看,150 个条目对于观察者来说应该不会太慢,因为我正在使用 ng-repeat 来显示列表项。如果有人有办法,我可以使用 cordovaSQLite 插件显示这么多项目列表功能更快让我知道!目前列表几乎无法使用,我也在其他设备上尝试过,结果相同。
我也试过在控制器中创建大约 200 个虚拟对象(没有调用数据库来获取数据)并且性能很好。这就是为什么我认为这是一个 SQLite 性能问题。这是我第一次 post 在这里,如果我不够清楚,请道歉。
你的问题可能来自几个方面。
你运行在Android吗?
首先,如果您在 android 上是 运行,请注意列表管理和滚动目前在 ionic 上非常蹩脚。就我而言,只有 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 个列(A 和 B),并且如果您仅使用 A 来查询 table,那么您只需要 ColA 上的一个索引,而 IndexDefinition 之上将等于:(A)
此外,查看官方 sqlite 文档以了解如何管理索引:
https://www.sqlite.org/lang_createindex.html
更新到 ionic RC5
如果您还没有这样做,那就去做吧。
在 1.0.0-rc5
上滚动 ng-repeat 有了巨大的改进
其他
如果这些信息不起作用,请提供有关您的问题的更多信息:
- 列表是不可滚动的吗?或者在显示之前延迟很多?或两者兼而有之?
好的,所以我在生成列表的模板中使用了 collection-repeat 而不是 ng-repeat。大大提高了列表的性能。我希望这对某人有所帮助,因为它让我发疯!
我正在使用 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;
})
所以查询 returns 大约 150 个条目,我需要在一页上全部显示(我研究了无限滚动和分页,但我的客户想要在一页上显示所有条目,所以这不是一个选项。从我读过的内容来看,150 个条目对于观察者来说应该不会太慢,因为我正在使用 ng-repeat 来显示列表项。如果有人有办法,我可以使用 cordovaSQLite 插件显示这么多项目列表功能更快让我知道!目前列表几乎无法使用,我也在其他设备上尝试过,结果相同。
我也试过在控制器中创建大约 200 个虚拟对象(没有调用数据库来获取数据)并且性能很好。这就是为什么我认为这是一个 SQLite 性能问题。这是我第一次 post 在这里,如果我不够清楚,请道歉。
你的问题可能来自几个方面。
你运行在Android吗?
首先,如果您在 android 上是 运行,请注意列表管理和滚动目前在 ionic 上非常蹩脚。就我而言,只有 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 个列(A 和 B),并且如果您仅使用 A 来查询 table,那么您只需要 ColA 上的一个索引,而 IndexDefinition 之上将等于:(A)
此外,查看官方 sqlite 文档以了解如何管理索引: https://www.sqlite.org/lang_createindex.html
更新到 ionic RC5
如果您还没有这样做,那就去做吧。 在 1.0.0-rc5
上滚动 ng-repeat 有了巨大的改进其他
如果这些信息不起作用,请提供有关您的问题的更多信息: - 列表是不可滚动的吗?或者在显示之前延迟很多?或两者兼而有之?
好的,所以我在生成列表的模板中使用了 collection-repeat 而不是 ng-repeat。大大提高了列表的性能。我希望这对某人有所帮助,因为它让我发疯!