React Native(iOS)集成Realm报错:unordered_map::at: key not found
React Native + Realm iOS端调用
realm.write和realm.generate抛出unordered_map::at: key not found错误 我在学习React Native课程时,采用Realm做本地数据存储。Android端调用realm.write和realm.generate方法完全正常,但iOS端运行时抛出如下错误:
[Error: Exception in HostFunction: unordered_map::at: key not found]
环境依赖版本
- macOS Ventura 13.4(Apple M1芯片)
- XCode 14.3 (14E222b)
- iPhone 12 模拟器(iOS 16.4,已尝试Apple和Rosetta模式)
- 项目依赖:
- "react-native-get-random-values": "^1.9.0"
- "expo": "~48.0.15"
相关代码片段
function handleDepartureRegister() { try { // 省略部分代码 realm.write(() => { realm.create('Historic', Historic.generate({ user_id: user!.id, license_plate: licensePlate.toUpperCase(), description, })) }); Alert.alert('Saída', 'Saída do veículo registrada com sucesso.'); goBack(); } catch (error) { console.log(error); Alert.alert( 'Erro', 'Não foi possível registrar a saída do veículo.' ); // 省略部分代码 } }
已尝试的解决措施
- 在ios目录下执行
pod install - 删除并重新创建模拟器
- 切换Apple/Rosetta模式运行模拟器
- 重新安装
expo-crypto并执行pod install
可能的解决方案
1. 检查Realm模型Historic的定义与generate方法
这个错误大多和Realm模型字段不匹配有关:
- 确认
Historic模型的所有必填字段(比如主键)都在generate方法中正确生成或传入,没有遗漏 - 检查传入的字段类型是否和模型定义完全一致,比如模型中
user_id是字符串类型,确保传入的user!.id确实是字符串而非其他类型 - 查看
Historic.generate方法内部是否有iOS端不兼容的逻辑,比如依赖了未正确初始化的随机数生成工具
2. 确保Realm实例已完全初始化
iOS端Realm初始化可能存在异步延迟,务必在Realm实例准备就绪后再执行写入操作。可以通过监听realm.isReady状态,或者在useEffect中等待初始化完成:
useEffect(() => { if (realm?.isReady) { // 执行需要操作Realm的逻辑 } }, [realm]);
3. 彻底清理iOS构建缓存
缓存问题是iOS端常见的坑,按以下步骤操作:
- 关闭模拟器和Metro服务
- 删除ios目录下的
Pods文件夹和Podfile.lock文件 - 执行命令:
cd ios && pod deintegrate && pod install - 删除XCode的Derived Data:打开XCode -> 设置 -> 位置 -> Derived Data,点击路径打开文件夹后删除当前项目的缓存文件
- 重新启动Metro并构建项目
4. 确认Realm与Expo版本兼容
Expo 48对Realm版本有特定要求,检查项目中Realm版本是否和Expo 48兼容,若不匹配,尝试升级或降级至兼容版本
5. 确保react-native-get-random-values正确导入
如果Historic.generate中用到了随机值生成,确保在App入口文件最顶部导入react-native-get-random-values:
import 'react-native-get-random-values';
内容的提问来源于stack exchange,提问作者Carlos Eduardo
相关产品推荐
相关产品推荐

