Realm 10.1.1筛选关联对象时出现栈溢出错误求助
解决Realm筛选时出现的Maximum call stack size exceeded错误
这个问题的核心根源是Person和Company之间的循环关联导致递归序列化溢出:你的Schema里,Person关联了Company数组,而Company又通过linkingObjects反向关联回Person,形成了闭环。当你批量筛选年龄大于30的Person时,结果集在被序列化(比如React Native渲染时自动调用toJSON,或者你手动执行JSON.stringify)的过程中,会无限递归遍历Person→Company→Person→Company...的关联,最终触发栈溢出。而按ID筛选正常,是因为单个对象的递归深度还没达到栈的临界值。
以下是几种可行的解决方案:
1. 手动映射数据,切断循环引用
不要直接将Realm查询结果传递给组件或进行序列化,而是手动提取需要的字段,排除循环关联的部分:
// 筛选后手动映射,只保留需要的字段,避免递归 const filteredPersons = realm.objects("Person").filtered("age > 30").map(person => ({ _id: person._id, name: person.name, age: person.age, // 如果需要公司数据,只提取基础字段,不包含反向关联的boss companies: person.company.map(company => ({ _id: company._id, name: company.name })) }));
这种方式最直接,能快速解决问题,且不需要修改Schema。
2. 修改Schema,移除不必要的反向关联
如果业务场景允许,可以去掉其中一方的反向关联,从根源上避免循环:
// 修改Company Schema,移除boss的linkingObjects关联 const Company = { name: "Company", primaryKey: "_id", properties: { _id: "objectId", name: "string" } }; // 如果需要查询公司的老板,手动执行查询而非依赖Schema关联 const getCompanyBoss = (companyId) => { return realm.objects("Person").filtered("company._id == $0", companyId)[0]; };
3. 重写Realm对象的toJSON方法
如果必须保留Schema的关联关系,可以自定义toJSON方法,在序列化时主动排除循环字段:
const Person = { name: "User", primaryKey: "_id", properties: { _id: "objectId", name: "string", age: "number", company: "Company[]" }, toJSON() { return { _id: this._id, name: this.name, age: this.age, // 序列化公司时只取基础字段 company: this.company.map(c => ({ _id: c._id, name: c.name })) }; } }; const Company = { name: "Company", primaryKey: "_id", properties: { _id: "objectId", name: "string", boss: { type: 'linkingObjects', objectType: 'Person', property: 'company' } }, toJSON() { return { _id: this._id, name: this.name // 不序列化boss字段,切断循环 }; } };
这样当Realm对象自动触发序列化时,就不会陷入无限递归。
4. 升级Realm版本(谨慎操作)
虽然你使用的是10.1.1,但10.x系列后续版本可能对循环序列化的场景有更完善的修复。可以尝试升级到兼容React Native 0.62.2的最新Realm版本(注意要确认版本兼容性,避免引入其他问题)。
内容的提问来源于stack exchange,提问作者Fabio G.C
相关产品推荐
相关产品推荐

