2015-05-06 54 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