等待Realm写入完成

时间:2016-07-02 06:38:01

标签: xamarin realm

我们在Xamarin应用程序中使用Realm,并且在根据远程源刷新本地数据库时遇到一些问题。数据从远程端点获取,并使用Realm在本地存储,以便更轻松/更快地访问。

计划流程如下:

  1. 从远程源获取数据(如果可能)。
  2. 循环浏览远程源返回的实体,同时跟踪到目前为止我们已经看到的ID。新的或更新的实体将写入Realm。
  3. 遍历本地存储的实体集,删除我们在步骤2中未见Realm.Remove(entity);的实体(在交易中)
  4. 返回Realm.All<Entity>();
  5. 不幸的是,在所有&#34;删除&#34;之前,第4步返回实体。已经写好了。因此,在本地数据库完全同步之前需要进行几次刷新。

    删除操作如下:

    foreach (Entity entity in realm.All<Entity>())
    {
        if (seenIds.Contains(entity.Id))
        {
            continue;
        }
    
        realm.Write(() => {
            realm.Remove(entity);
        });
    }
    

    在返回Realm.All<Entity>();之前,有没有办法让Realm等到事务完成?

1 个答案:

答案 0 :(得分:0)

我很确定这不是特别的Realm问题 - 相同的模式会导致许多可枚举的可变容器出现问题。您正在迭代它时从列表中删除项目,因此枚举进行得太过分了。

Realm交易没有缓冲,所以我保证关于让Realm等到事务完成但是你的列表逻辑。

有两种不同的基本方法:

  1. 使用ToList获取All中所有对象的列表 - 如果有很多对象,这是很昂贵的,因为您将实例化所有对象。
  2. 不是删除循环内的对象,而是将它们添加到要删除的的列表中,然后迭代该列表。
  3. 请注意,使用每次删除的事务,就像在Write执行此操作一样,速度相对较慢。您可以在一个事务中执行许多操作。

    我们还在努力对Realm API进行其他改进,这可能会提供更有效的方法来处理这个问题。知道相对数据大小 - 循环中的删除次数与记录次数非常有用。我们喜欢获取样本数据和模式(可以私下发送到help@realm.io)。

    选项2的一个例子:

    var toDelete = new List<Entity>();
    foreach (Entity entity in realm.All<Entity>())
    {
        if (!seenIds.Contains(entity.Id))
            toDelete.Add(entity);
    }
    realm.Write(() => {
        foreach (Entity entity in toDelete))
            realm.Remove(entity);
    });