2013-07-17 133 views
2

這是一個使用Xamarin的Android應用程序。MvvmCross與SqlLite極其緩慢

我有一個簡單的搜索屏幕,用戶根據狀態,城市,州際等選擇篩選(1個或多個選項)。當狀態發生變化時,其他下拉菜單會適當變化(根據該州或城市間存在的城市等)。每次更改狀態下拉菜單以更新其他下拉菜單時,需要花費2秒或更多時間,同時UI無法響應。我還注意到RaisePropertyChanged事件實際上並沒有發生,直到set方法中的所有代碼都完成。我如何加快事情以提供更好的用戶體驗?

以下是緩慢的SQL調用。我正在查找基於父級屬性的子對象列表。

 var parentIds = _connection.Table<Parent>().Where(x => x.State == state).Select(x => x.Id); 
     return _connection.Table<Child>() 
          .Where(x => parentIds.Contains(x.ParentId)) 
          .Select(x => x.ChildProperty) 
          .OrderBy(x => x) 
          .Distinct(); 

回答

1

的解決方案是更改查詢到以下幾點:

 var parentIds = _connection.Table<Parent>().Where(x => x.State == state).Select(x => x.Id).ToList(); 
     var children = _connection.Table<Child>().ToList(); 
     return 
      children.Where(x => parentIds.Contains(x.ParentId)) 
        .Select(x => x.ChildProperty) 
        .OrderBy(x => x) 
        .Distinct(); 
+0

我很好奇,爲什麼這個查詢在SqlLite中工作得更好。這與執行不佳的查詢幾乎完全相同,除了我調用.ToList()以在調用我的Linq查詢之前強制將對象加載到內存中。 –

2

隨着所有的優化,「先測量,優化第二」。

當你說事情非常緩慢時,找出是什麼。這是UI重畫嗎?這是一個特定的SQLite調用嗎?它是一個特定的線程交互嗎?

一旦你確定什麼是緩慢的,那麼有技術,您可以使用:

  • 把各種東西緩慢的背景非UI線程
  • 到虛擬化存儲加載(所以你不」 t不得不加載大列表的通用性)
  • 將數據緩存在內存中,因此您不必每次都要訪問數據庫
  • 將更多索引添加到大型數據庫(或內存存儲)

但是所有這些想法都應該在測量之後(在我的觀點和經驗中)出現,否則你可能很容易就會優化錯誤的東西。

+0

好一點。正在查找基於父項屬性的子項目列表的SQL調用是很慢的部分。將此代碼添加到問題中。 –

+0

感謝您的幫助。你的建議導致瞭解決方案。 –