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
相关产品推荐
相关产品推荐

