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

