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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:12:42