UWP中Realm如何避免关联FirstClass对象重复创建?
解决Realm中关联对象重复创建的问题:复用已有实例的方案
当然可行!这是Realm开发里非常常见的需求——避免关联对象被重复存储,而是直接关联已有的实例。下面我会给你一步步讲清楚实现方法:
步骤1:给FirstClass添加主键
Realm识别“已有对象”的核心是主键——没有主键的对象,Realm会默认每次都当成新实例存储。所以首先要给你的FirstClass添加主键字段,并且确保这个字段能唯一标识一个实例。
另外注意:你的类必须继承RealmObject才能被Realm管理,之前的代码里漏掉了这一点,一定要补上。
示例代码(假设用Name作为唯一标识,如果Name可能重复,建议改用Guid类型的Id):
public class FirstClass : RealmObject { // 用Name作为主键,确保每个FirstClass的Name唯一 [PrimaryKey] public string Name { get; set; } public string Age { get; set; } }
如果Name可能重复,更稳妥的做法是用Guid主键:
public class FirstClass : RealmObject { [PrimaryKey] public string Id { get; set; } = Guid.NewGuid().ToString(); public string Name { get; set; } public string Age { get; set; } }
步骤2:查询复用已有实例
在创建OtherClass并关联FirstClass时,不要直接new一个新对象就添加,而是先查询Realm中是否已经存在符合条件的FirstClass实例:
var realm = Realm.GetInstance(); // 假设我们要关联Name为"Alice"的FirstClass var existingFirstClass = realm.All<FirstClass>().FirstOrDefault(fc => fc.Name == "Alice"); FirstClass targetFirstClass; if (existingFirstClass == null) { // 如果不存在,才创建新实例并写入Realm targetFirstClass = new FirstClass { Name = "Alice", Age = "30" }; realm.Write(() => { realm.Add(targetFirstClass); }); } else { // 存在的话直接复用已有实例 targetFirstClass = existingFirstClass; } // 关联到OtherClass并保存 realm.Write(() => { var otherClass = new OtherClass(); otherClass.From.Add(targetFirstClass); realm.Add(otherClass); });
步骤3:封装复用逻辑(可选)
为了避免重复写查询代码,你可以把“查询或创建”的逻辑封装成一个工具方法,让代码更简洁:
public static FirstClass GetOrCreateFirstClass(Realm realm, string name, string age) { // 根据主键或唯一字段查询已有实例 var existing = realm.All<FirstClass>().FirstOrDefault(fc => fc.Name == name); if (existing != null) return existing; // 不存在则创建新实例 var newInstance = new FirstClass { Name = name, Age = age }; realm.Write(() => realm.Add(newInstance)); return newInstance; }
使用的时候就非常方便:
var realm = Realm.GetInstance(); // 获取或创建Alice和Bob的实例 var alice = GetOrCreateFirstClass(realm, "Alice", "30"); var bob = GetOrCreateFirstClass(realm, "Bob", "25"); realm.Write(() => { var other = new OtherClass(); other.From.Add(alice); other.To.Add(bob); realm.Add(other); });
关键注意事项
- 所有涉及Realm对象的写入操作(添加、修改)都必须放在
realm.Write()代码块中执行,否则会抛出异常。 - 主键字段一旦设置就不能修改,所以一定要选合适的字段作为主键(推荐用不可变的Guid,而不是可能变化的业务字段)。
OtherClass同样需要继承RealmObject,并且它的From和To列表必须是Realm支持的IList<FirstClass>(你的代码已经符合这一点)。
内容的提问来源于stack exchange,提问作者newone
相关产品推荐
相关产品推荐

