2013-07-17 131 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

感谢您的帮助。你的建议导致了解决方案。 –