React Native Realm数据库报错:无效Results对象/线程Schema不匹配
Realm数据库单Schema操作问题解决方案
问题1:关闭数据库时出现 Access to invalidated Results objects 报错
原因
Realm的Results是绑定到Realm实例的实时懒加载查询结果,一旦调用realm.close()销毁实例,外部拿到的Results就会失效,后续访问必然触发报错。你当前代码直接返回responseData(即Results实例)后立刻关闭Realm,外部使用时就会出现这个问题。
解决方案
把Results转换为脱离Realm实例的普通JavaScript数组(比如用Array.from()或slice()),让数据被一次性提取出来,不再依赖原Realm实例。修改后的代码如下:
async fetchData(options) { const { schema, filter, sort } = options; return new Promise((resolve) => { Realm.open({ schema: [schema], }).then(realm => { // 注意:objects()方法需要传入模型名称字符串,而非Schema对象 let responseData = realm.objects(schema.name); if (filter) { responseData = responseData.filtered(filter); } if (sort) { responseData = responseData.sorted(sort); } // 转换为普通数组,脱离Realm实例绑定 const dataArray = Array.from(responseData); resolve(dataArray); realm.close(); }); }); }
问题2:切换Schema时出现 already opened on current thread with different schema 报错
原因
Realm不允许同一线程同时打开多个拥有不同Schema的Realm实例,若之前的实例未关闭就用新Schema打开,就会触发该错误。此外,不同Schema应对应独立的数据库文件,否则会引发Schema冲突。
解决方案
- 切换Schema前关闭当前线程所有已打开的Realm实例,调用
Realm.closeAll()确保无残留实例; - 为每个Schema指定独立的数据库路径,避免不同Schema共用同一文件。
示例代码如下:
async operateWithNewSchema(newSchema) { // 关闭当前线程所有打开的Realm实例 Realm.closeAll(); // 为新Schema生成独立数据库路径,用Schema名称区分 const realmPath = Realm.defaultPath.replace('.realm', `_${newSchema.name}.realm`); return new Promise((resolve, reject) => { Realm.open({ schema: [newSchema], path: realmPath, }).then(realm => { // 执行数据库操作 const data = realm.objects(newSchema.name); resolve(Array.from(data)); realm.close(); }).catch(err => { reject(err); }); }); }
内容的提问来源于stack exchange,提问作者krishan mohan verma
相关产品推荐
相关产品推荐

