MvvmCross与SQLite非常慢

时间:2013-07-17 14:41:42

标签: android sqlite xamarin mvvmcross

这是一个使用Xamarin的Android应用程序。

我有一个简单的搜索屏幕,用户根据州,城市,州际等选择过滤(1个或多个选项)。当状态发生变化时,其他下拉列表会相应更改(根据该州存在的城市或州际公路等)。每次更改状态下拉列表以更新其他下拉列表时,它需要2秒或更长时间,同时UI不响应。我还注意到,在set方法中的所有代码完成之前,实际上不会发生RaisePropertyChanged事件。如何加快速度以提供更好的用户体验?

这是一个很慢的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();

2 个答案:

答案 0 :(得分:2)

通过所有优化,“先测量,优化第二”。

当你说某些事情非常缓慢时,找出它是什么。这是UI重绘吗?这是一个特定的SQLite调用吗?这是一个特定的线程交互。

一旦你确定了什么是慢的,那么你可以使用一些技术:

  • 将各种慢速内容放在后台非UI线程上
  • 虚拟化内存加载(因此您不必加载大型列表的完整性)
  • 将数据缓存在内存中,这样您每次都不必点击数据库
  • 为大型数据库(或内存存储)添加更多索引

但所有这些想法都应该在测量之后(在我看来和经验中),否则你很容易就会最终优化错误的东西。

答案 1 :(得分: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();