尝试将downloadUri添加到Firestore文档时出错。 “无法序列化对象。最大深度超过500”

时间:2019-05-14 20:29:29

标签: android firebase kotlin google-cloud-firestore

我有一个Firestore集合,其中每个文档都有与之关联的图像,该图像存储在Firebase存储器中。以前,我存储图像引用并通过该图像检索图像,但是由于每次调用都花费一些时间,因此我尝试切换到存储downloaduri,以便使用Picasso可以通过downloaduri对其进行引用,而不必每次都检索downloaduri。项目。但是,当我尝试在getdownloaduri的成功监听器中写入文档时,出现指示对象周期的错误。

如果我不包括对数据库的更新,则代码能够成功检索到downloaduri并将其传递给recyclerview并显示图像,只有在尝试将其上传到数据库时,我才能错误。我尝试过在dowonloadUri.addonsuccesslistenr之外更新数据库,但是我在监听器中设置的值从未在监听器之外更新。

 if(menucarditem.dluri == null)
                        {
                            val storageRef = storage.reference
                            val pathReference = storageRef.child(menucarditem.img)
                            pathReference.downloadUrl.addOnSuccessListener {
                                menucarditem.dluri = it
                                dbMealItem.dluri = it
                                db.collection("menuitems").document(dbMealItem.CatererId + dbMealItem.name).set(dbMealItem).addOnSuccessListener {  }
                                    .addOnFailureListener { }

                           viewAdapter.notifyDataSetChanged()

                            }
       .addOnFailureListener{
                                    Toast.makeText(this, "Image from database not found", Toast.LENGTH_LONG).show()
                                    Log.w(TAG, "Error getting documents: ", it)
                                }
}

运行时输出的错误是:

  

E / AndroidRuntime:java.lang.IllegalArgumentException:无法   序列化对象。超过最大深度500,这可能是   表示存在对象周期(在字段中找到   dluri.canonicalUri.canonicalUri.canonicalUri.canonicalUri.canonicalUri.canonicalUri CanonicalUri.canonicalUri.canonicalUri.canonicalUri.canonicalUri.canonicalUri.canonicalUri.canonicalUri.canonicalUri.canonicalUri.canonicalUri.canonicalUri.canonicalUri

2 个答案:

答案 0 :(得分:0)

解决了我的问题的是,地图中的某些对象与地图名称相同,因此它无限地嵌套在其中。

希望它可以解决您的问题!

答案 1 :(得分:0)

问题出在数据类型Uri downloadUri = task.getResult();中,返回uri。但是可能在Firestore DB中需要字符串。因此,在更新到Firestore之前,将downloadUri更改为字符串:

Uri downloadUri = task.getResult();
String uri = downloadUri.toString();
db.collection("menuitems").document(dbMealItem.CatererId + dbMealItem.name).set(**uri**);