Flutter Realm报错:Property type ObjectId not supported 求助
解决Realm查询MongoDB ObjectId主键报错问题
核心原因
你遇到的Property type ObjectId not supported错误,本质是实体类UserSchema的_id字段类型定义错误——大概率用了MongoDB原生的org.bson.types.ObjectId,而非Realm Dart库提供的ObjectId类型。
分步解决方案
1. 修正实体类的_id字段定义
确保UserSchema中_id使用Realm自带的ObjectId,并标注主键:
import 'package:realm/realm.dart'; part 'user_schema.g.dart'; @RealmModel() class _UserSchema { @PrimaryKey() late ObjectId _id; // 必须是io.realm.mongodb.types.ObjectId // 其他业务字段... }
修改后记得重新运行Realm代码生成命令:dart run realm generate
2. 正确使用Realm ObjectId进行查询
用主键查询(推荐):直接使用
find方法,传入Realm解析后的ObjectId:// 用Realm的ObjectId解析字符串 final realmObjectId = ObjectId.parse(retrievedId); // 按主键查询 final userData = realmServices.realm.find<UserSchema>(realmObjectId);用查询语句查询:如果要用
query方法,注意oid()语法需要传入纯字符串ID,不要带ObjectId("...")格式:// 直接用原始的retrievedId字符串拼接 final queryStr = "_id == oid('$retrievedId')"; final userData = realmServices.realm.query<UserSchema>(queryStr).firstOrNull;
3. 为什么之前的尝试失败?
- 用MongoDB的
ObjectId传入Realm查询:Realm不识别第三方ObjectId类型,所以报类型不支持错误。 - 拼接
oid($id)时出错:因为print(id)输出的是ObjectId("xxx")格式,拼到查询语句里会变成oid(ObjectId("xxx")),不符合Realm查询语法,导致Invalid syntax。 - 转字符串查询无结果:实体类中
_id是ObjectId类型,存储的不是字符串,字符串匹配自然无法命中数据。
内容的提问来源于stack exchange,提问作者Darius
相关产品推荐
相关产品推荐

