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

React-Native升级Realm 10.8.0后第二次插入数据报字段为null错误

问题原因
  • Realm v10.8.0对自定义模型类的处理逻辑做了调整,当传入未继承Realm.Object的自定义类实例给realm.create方法时,Realm会修改该自定义类的原型构造逻辑,导致后续new该类得到的实例无法正常挂载自定义属性,你赋值的属性不会被实际写入实例对象,Realm读取到的属性值就为null,触发类型校验报错。
  • 第一次执行new Workflows()时类的原型还未被修改,所以属性赋值、插入操作都正常;第一次调用realm.create传入实例后,类的构造逻辑被污染,第二次new得到的实例就出现属性为空的问题。
解决方案

有三种可选方案,根据你的业务场景选择即可:

方案1(推荐):调整模型类定义为Realm规范写法

让自定义模型类继承Realm.Object基类,符合Realm的模型定义规范,从根源避免该问题:

import Realm from 'realm';

// 继承Realm.Object
class Workflows extends Realm.Object {
    static schema = {
        name: 'Workflows',
        primaryKey: 'InternalName',
        properties: {
            ExternalName: 'string',
            InternalName: 'string',
        }
    };
}

// 初始化Realm时schema直接传入类即可
this.realm = new Realm({
    schema: [Workflows],
    schemaVersion: 1,
});

// 写入数据时可以直接调用构造函数创建对象,不需要调用realm.create
this.realm.write(() => {
  this.record = new Workflows({
    InternalName: "Internal Name" + this.ctr,
    ExternalName: "External Name" + this.ctr,
  });
})

方案2:直接传普通字面量对象给realm.create

不需要修改现有模型类定义,写入时不要传入Workflows类的实例,直接传入属性一致的普通字面量对象即可,就是你测试时验证过可行的写法:

this.realm.write(() => {
    this.record = this.realm.create(Workflows.schema.name, { 
        InternalName: "Internal Name" + this.ctr, 
        ExternalName: "External Name" + this.ctr 
    });
})

方案3:类实例转普通对象后传入

如果需要保留现有创建类实例的逻辑,写入前把类实例浅拷贝为普通对象再传入即可:

this.realm.write(() => {
    // 浅拷贝类实例为普通对象
    const workflowData = {...workflows};
    this.record = this.realm.create(Workflows.schema.name, workflowData);
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:09:01