【问题标题】:MvvmCross with SQLite extremely slowMvvmCross 与 SQLite 非常慢
【发布时间】:2013-07-17 14:41:41
【问题描述】:

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

我有一个简单的搜索屏幕,用户可以在其中选择根据州、城市、州际等(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();

【问题讨论】:

    标签: android sqlite xamarin mvvmcross


    【解决方案1】:

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

    当您说某事非常慢时,请确定是什么。是UI重绘吗?它是一个特定的 SQLite 调用吗?是一个特定的线程交互吗?

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

    • 在后台非 UI 线程上放置各种缓慢的东西
    • 虚拟化内存加载(因此您不必加载整个大列表)
    • 在内存中缓存数据,这样您就不必每次都访问数据库
    • 为大型数据库(或内存存储)添加更多索引

    但所有这些想法都应该在衡量之后提出(根据我的观点和经验),否则你很容易最终优化错误的东西。

    【讨论】:

    • 好点。根据父项的属性查找子项列表的 SQL 调用是较慢的部分。将此代码添加到问题中。
    • 感谢您的帮助。您的建议促成了解决方案。
    【解决方案2】:

    解决方案是将查询更改为以下内容:

            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();
    

    【讨论】:

    • 我很好奇为什么这个查询在 SqlLite 中工作得这么好。它与性能不佳的查询几乎相同,只是我在调用 Linq 查询之前调用 .ToList() 来强制将对象加载到内存中。
    猜你喜欢
    • 1970-01-01
    • 2018-07-17
    • 2013-01-30
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多