Parse Platform Kotlin实现Users与Categories多对多关联报错如何解决
报错原因
你标注行的报错是因为category变量是未执行的ParseQuery查询对象,不是查询返回的Category表实体对象,不能直接作为关联字段的值存储。
表结构合理性说明
- 你当前设计的三表结构(Users、Categories、UserCategory关联表)完全符合多对多关联的需求,没有问题。这种手动维护关联表的方案,适合需要在关联关系上存储额外字段(如关联时间、关联来源等)的场景。
- 如果你不需要存储关联相关的额外属性,也可以选择Parse内置的
ParseRelation能力实现多对多,无需手动创建关联表。
修复后的实现代码
你需要先执行查询拿到真实的Category实体,再写入关联表:
异步执行(推荐,主线程可直接调用)
// 第一步:执行查询获取名为Employee的分类实体 ParseQuery.getQuery<ParseObject>("Category") .whereMatches("name", "Employee") .getFirstInBackground { category, error -> if (error == null && category != null) { // 第二步:构造关联表记录并保存 val userCategory = ParseObject("UserCategory") userCategory.put("userId", ParseUser.getCurrentUser()) userCategory.put("categoryId", category) userCategory.saveInBackground { saveError -> if (saveError == null) { // 关联保存成功逻辑 } else { // 关联保存失败处理 } } } else { // 分类查询失败/对应分类不存在的处理逻辑 } }
同步执行(仅可在子线程调用)
val category = ParseQuery.getQuery<ParseObject>("Category") .whereMatches("name", "Employee") .first val entity = ParseObject("UserCategory") entity.put("userId", ParseUser.getCurrentUser()) entity.put("categoryId", category) entity.save()
可选轻量方案:使用ParseRelation实现多对多
如果无需存储关联额外属性,可直接使用Parse原生Relation能力,无需手动创建关联表:
- 在Parse控制台给User表新增
categories字段,类型选择Relation,目标表选择Category - 关联绑定代码如下:
val currentUser = ParseUser.getCurrentUser() // 获取用户的分类关联对象 val categoryRelation = currentUser.getRelation<ParseRelation<ParseObject>>("categories") // 加入需要关联的分类 categoryRelation.add(category) // 保存用户即可完成关联 currentUser.saveInBackground() // 后续查询用户关联的分类也可直接通过Relation查询 categoryRelation.query.findInBackground { categories, err -> // 拿到当前用户关联的全部分类 }
内容的提问来源于stack exchange,提问作者wenus
相关产品推荐
相关产品推荐

