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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:59:25