【问题标题】:Cannot get hash map value as ArrayList无法将哈希映射值作为 ArrayList
【发布时间】:2021-08-18 17:40:21
【问题描述】:

我有一个名为 Product 的数据类,它的对象存储在一个 ArrayList 中。

然后我正在创建一个哈希图val prodInCartMap: HashMap<String, ArrayList<Product> = HashMap()

我将数组列表添加到哈希映射prodInCartMap["prodInCart"] = list,其中列表为val list: ArrayList<Product> = ArrayList()

然后我将数据上传到 Cloud Firestore。

当我得到数据时,这是代码:

fun getHashMapActivity(uid: String, activity: CartActivity){
        FirebaseFirestore.getInstance().collection(Constants.CART_COLLECTION)
            .document(uid)
            .get()
            .addOnSuccessListener {
                val map: HashMap<String, Any> = it.data as HashMap<String, ArrayList<Product>>
                val temp = map["prodInCart"] as ArrayList<Product>
                for (i in temp.indices){
                     val product: Product = temp[i] as Product
                }
            }
    }

执行 for 循环时出现此错误:

java.lang.ClassCastException: java.util.HashMap 无法转换为 com.example.grocerystore.models.Product

为什么转成ArrayList后还是hash map?

这是我的数据库的截图:

每当我将鼠标悬停在:val cart: HashMap&lt;String, ArrayList&lt;Product&gt;&gt; = it.data as HashMap&lt;String, ArrayList&lt;Product&gt;&gt;

我收到此警告:

未经检查的演员表:(Mutable)Map?到 kotlin.collections.HashMap/> / = java.util.HashMap */

我的产品类别:

data class Product(
        var prod_name: String = "",
        var prod_image: Int = -1,
        var prod_desc: String = "",
        var prod_price: Int = -1,
        var prod_tags: ArrayList<String> = ArrayList(),
        var kgOrPack: Boolean = true //true: pack, false: kg
): Serializable

【问题讨论】:

  • 我不了解 Firebase,但了解您如何“将数据上传到 Firebase Firestore”可能会有所帮助。您是否尝试过记录/打印检索到的对象(即您的 successListener 的 it)?
  • 我无法访问上传的数据,我需要一个单独的方法来获取我在问题中所做的数据。但我可以访问哈希图并在本地获取数组列表
  • 请编辑您的问题并将您的数据库结构添加为屏幕截图。也请回复@。
  • @AlexMamo 我已经添加了
  • 您能否再添加一个屏幕截图,以便我们可以看到文档的开头?

标签: firebase kotlin arraylist google-cloud-firestore hashmap


【解决方案1】:

您收到以下错误:

java.lang.ClassCastException:java.util.HashMap 无法转换为 com.example.grocerystore.models.Product

因为您试图循环遍历包含“HashMap”对象而不是“Product”对象的 ArrayList。由于这些类之间没有继承关系,因此实际上不可能进行强制转换,因此出现错误。有两种方法可以解决这个问题。

困难的方法是迭代 HashMap 对象并自己创建“Product”对象,或者,简单的方法是将 Product 对象数组映射到 List 中,如下文所述:

How to map an array of objects from Cloud Firestore to a List of objects?

【讨论】:

  • 它正在工作,但我有疑问,我已将数据作为HashMap&lt;String, ArrayList&lt;Product&gt;&gt; 放入firebase firestore,那么为什么在我从firebase firestore 获取它后我无法从hashmap 中获取ArrayList&lt;Product&gt;
  • 向 Firestore 添加数据时,应将其添加为HashMap&lt;String, Any&gt;,这意味着该值可以是任何对象。因此,当您尝试将该 HashMap 转换为 HashMap&lt;String, ArrayList&lt;Product&gt;&gt; 时,您会收到该警告。这是因为当时没有足够的信息来知道该值是 List 还是任何其他对象,因此会发出警告。 Firestore SDK 对几乎所有数据类型都有不同的风格,但不是列表。这就是为什么你应该从那篇文章中得到解决方案。
  • 我后来以HashMap&lt;String, ArrayList&lt;Product&gt;&gt; 的身份将它放到了firebase firestore,但也出现了这个错误,这就是我有疑问的原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
相关资源
最近更新 更多