【问题标题】:Realm + Xamarin Forms Update QueryRealm + Xamarin 表单更新查询
【发布时间】:2017-04-24 17:25:43
【问题描述】:

我正在使用 Realm + Xamarin Forms 来执行我认为可能的最基本操作:列表视图显示项目集合,搜索栏在用户键入时过滤结果。

我有一个 get only 集合属性,用作列表视图的项目源,最初是从 Realm 查询中填充的,它会随着数据的任何更改自动更新,但我不知道如何更新搜索文本添加一个集合并从字面上替换整个集合。

这是非常低效的——我假设这会触发为集合和其中的每个项目重新注册一组通知更改事件侦听器,并且通常会在每个字母被点击时造成混乱。

在过去,我创建了自己的包装可观察集合,并使用搜索方法来处理这个问题,我想这也是一个选项,但是有没有办法用 Realm 来做到这一点?也就是说,要在不重新创建整个集合的情况下更新查询,是否可以通过某种方式重新运行原始查询?

【问题讨论】:

    标签: c# xamarin xamarin.forms realm observablecollection


    【解决方案1】:

    更新:此技术不再有效。

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~

    ...它也不同于 LINQ to Objects 的行为,其中每次迭代都会重新计算表达式,这意味着条件两侧的更改都会影响结果。 Realm 查询将在第一次运行时评估条件的右侧。

    当您构建包含基于 -基于领域的条件的 Where 参数的查询时,除非您更新/执行查询,否则当这些变量/参数发生更改时,查询结果不会更新再次。

    领域查询是实时的,因为它们将继续代表数据库的当前状态。

    所以我要做的是创建一个过滤器类(RealmObject),然后如果您实例化一个“过滤器对象”,将其保存到 Realm,您可以将 Linq 的 Where 参数基于一个或多个“过滤器”属性。通过Realm.Add(filterObject, true) 更新此RealmObject 过滤器,您基于该对象的查询也会更新

    领域查询是实时的,因为它们将继续代表数据库的当前状态。

    结果是快速过滤,适用于任何 UI 搜索例程。

    示例模型:

    public class ARealmClass : RealmObject
    {
        public int Key { get; set; }
        public string KeyString { get; set; }
    }
    
    public class ARealmClassFilter : RealmObject
    {
        [PrimaryKey]
        public int Key { get; set; }
        public int FilterKeyBy { get; set; }
    }
    

    用一些测试数据填充一个领域

    var realm = Realm.GetInstance();
    var all = realm.All<ARealmClass>();
    if (all.Count() == 0)
    {
        realm.Write(() =>
        {
            for (int i = 0; i < 1000; i++)
            {
                var obj = new ARealmClass { Key = i, KeyString = i.ToString() };
                realm.Add(obj);
            }
        });
    }
    

    动态实时查询示例:

    var realm = Realm.GetInstance();
    var all = realm.All<ARealmClass>();
    Console.WriteLine(all.Count());
    var filterItem = new ARealmClassFilter { Key = 1, FilterKeyBy = 500 };
    realm.Write(() =>
    {
        realm.Add(filterItem);
    });
    var filtered = all.Where(_ => _.Key > filterItem.FilterKeyBy);
    Console.WriteLine(filtered.Count());
    realm.Write(() =>
    {
        filterItem.FilterKeyBy = 750;
        realm.Add(filterItem, true);
    });
    Console.WriteLine(filtered.Count());
    

    输出:

    2017-04-24 11:53:20.376 ios_build_foo[24496:3239020] 1000
    2017-04-24 11:53:20.423 ios_build_foo[24496:3239020] 499
    2017-04-24 11:53:20.425 ios_build_foo[24496:3239020] 249
    

    注意:引用文字@https://realm.io/docs/xamarin/latest/api/linqsupport.html

    【讨论】:

      猜你喜欢
      • 2015-03-07
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多