我们在Xamarin应用程序中使用Realm,并且在根据远程源刷新本地数据库时遇到一些问题。数据从远程端点获取,并使用Realm在本地存储,以便更轻松/更快地访问。
计划流程如下:
Realm.Remove(entity);
的实体(在交易中)Realm.All<Entity>();
不幸的是,在所有&#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等到事务完成?
答案 0 :(得分:0)
我很确定这不是特别的Realm问题 - 相同的模式会导致许多可枚举的可变容器出现问题。您正在迭代它时从列表中删除项目,因此枚举进行得太过分了。
Realm交易没有缓冲,所以我保证不关于让Realm等到事务完成但是你的列表逻辑。
有两种不同的基本方法:
ToList
获取All
中所有对象的列表 - 如果有很多对象,这是很昂贵的,因为您将实例化所有对象。请注意,使用每次删除的事务,就像在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);
});