【问题标题】:Better workaround to search nested object in realm xamarin在领域 xamarin 中搜索嵌套对象的更好解决方法
【发布时间】:2017-05-30 13:45:32
【问题描述】:

我正在尝试在领域中搜索嵌套对象,但出现以下错误

var contactList = realm.All<Contact>().Where( c => c.syncInfo.isSync == SyncStatus.NOT_SYNCED);

System.NotSupportedException:Equal 运算符的左侧 必须是对 Realm 中持久属性的直接访问。

无法处理“c.syncInfo.isSync”。

我知道Realm Xamarin 中不存在此功能,但我正在寻找更好的解决方法。

public class Contact : RealmObject
{
    [PrimaryKey]
    public Id {get;set;}

    public ContactName {get; set;}

    public SyncInfo syncInfo;
}

public class SyncInfo: RealmObject
{
    public int isSync { get; set; }     
    public long timestamp {get;set;}
}

到目前为止,我已经尝试使用 ToList()foreach 来查找记录,但我有 1000 个联系人,因此使用 ToList()foreach 会降低性能。

I tried to refer this thread but no luck

【问题讨论】:

    标签: c# xamarin realm


    【解决方案1】:

    ContactSyncInfo 之间似乎存在一对一的映射关系。所以你最好的选择是合并它们:

    public class Contact : RealmObject
    {
        [PrimaryKey]
        public Id {get;set;}
    
        public ContactName {get; set;}
    
        public int isSync { get; set; }     
    
        public long timestamp {get;set;}
    }
    

    这也将改进设计,因为您不必删除旧的SyncInfos(例如在替换联系人上的同步信息时)。

    【讨论】:

    • 我还有 20 个模型,我不想在其中复制 isSynctimestamp 字段,并且在领域中你不能扩展其他外部类,因此我想使用 SyncInfo 作为一个类成员作为一个组合
    • 我没有得到这个声明you won't have to delete old SyncInfos (e.g. when replacing the sync information on the contact).你能解释一下吗
    • 例如你有一个ContactSyncInfo.isSync = false。如果您从服务器获得一个新的SyncInfovar updatedInfo = serverClient.GetSyncInfoForContact(contact.Id) 并将其分配给您的联系人:contact.syncInfo = updatedInfo,则以前的对象现在将悬空 - 未分配给任何对象,需要删除。
    • 我理解您关于不想在很多类中复制属性的论点,这是一个有效的论点,但它是一个额外的字段(因为您无论如何都在复制 SyncInfo 属性)并将简化设计有点。
    • 我不认为答案是操作的问题,特别是如何查询嵌套对象。这不是。不知道为什么这被标记为答案。不管它是否有效。
    【解决方案2】:

    试试 .Where(c => c.syncInfo.isSync == SyncStatus.NOT_SYNCED.isSync && c.syncInfo.timestamp == SyncStatus.NOT_SYNCED.timestamp)

    【讨论】:

    • 这不会起作用,因为你会得到错误Where(c =&gt; c.syncInfo.isSync == SyncStatus.NOT_SYNCED.isSync被执行
    【解决方案3】:

    你能不能做这样的事情。将联系人存储在同步信息中。

    public class SyncInfo: RealmObject
    {
        public Contact contact { get; set; }
        public int isSync { get; set; }     
        public long timestamp { get;set; }
    }
    

    然后像这样查询:

    var unsyncedContacts = realm.All&lt;SyncInfo&gt;().Where(s.isSync == SyncStatus.NOT_SYNCED).Select(s =&gt; s.contact);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      相关资源
      最近更新 更多