You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Realm Xamarin iOS中已保存对象关联属性丢失问题排查

问题分析与解决方案

1. 修复代码中的明显错误

你的UserSelections类存在属性命名重复的问题,这会导致编译错误或运行时属性覆盖,直接引发后续无法正确读取ClassNo2的问题:

public class UserSelections : RealmObject
{
  public UserSelections() {}

  [PrimaryKey]
  public string FormId { get; private set; }
  public bool IsEntry { get; set; }
  public Class1 ClassNo1 { get; set; }
  // 错误:属性名重复,修正为正确名称
  public Class2 ClassNo2 { get; set; }
  public string Site { get; set; }
  public string State { get; set; }
  // 补充:查询用到的Completed属性需添加定义
  public bool Completed { get; set; }
}

2. 确保被引用对象正确被Realm管理

Realm中保存包含其他RealmObject引用的对象时,必须保证被引用的userEntryClass1、userEntryClass2处于被Realm管理的状态(即已添加到当前Realm实例)。如果这些对象是外部创建的未管理对象,需在保存主对象前将它们加入Realm:

realm.Write(() => 
{
   // 先将被引用对象添加到Realm(如果未被管理)
   if (!userEntryClass1.IsManaged)
   {
       realm.Add(userEntryClass1);
   }
   if (!userEntryClass2.IsManaged)
   {
       realm.Add(userEntryClass2);
   }

   var userSelections = new UserSelections
   {
     FormId = "123TEST",
     IsEntry = true,
     Completed = true, // 设置查询用到的状态属性
     ClassNo1 = userEntryClass1,
     ClassNo2 = userEntryClass2,
     Site = "Some site",
     State = "Some state here"
   };

   realm.Add(userSelections);
});

3. 排查查询与对象生命周期问题

  • 原查询代码中使用了frm.Completed,但UserSelections类未定义该属性,必须补充定义(如上述代码),否则查询结果为空或抛出异常。
  • 重复查询时,可重新打开Realm实例验证持久化状态,排除内存对象引用的干扰:
    using (var realm = Realm.GetInstance())
    {
        var completedForms = realm.All<UserSelections>().Where(frm => frm.Completed).ToList();
        // 此处检查ClassNo1和ClassNo2是否正常读取
    }
    

4. 额外注意事项

  • 所有Realm对象的修改、添加操作必须在Write事务内执行,否则数据无法持久化。
  • 确保Class1和Class2类定义正确,必要时添加主键属性,避免因对象标识问题导致引用丢失。

内容的提问来源于stack exchange,提问作者Musikero31

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:22:50