如何从 Firebase 中的实时数据库中获取数组

Posted

技术标签:

【中文标题】如何从 Firebase 中的实时数据库中获取数组【英文标题】:How to get array from Real-Time Database in Firebase 【发布时间】:2019-02-26 23:02:33 【问题描述】:

Product 类为:

data class Product(
val title:String,
val photoURL:String,
val description:String,
val price:Double
)
//and i want to make an array like this 
val r = arrayListOf<Product>()

所以基本上我想制作 Firebase_Database_products 的数组列表 任何帮助表示赞赏:)

【问题讨论】:

Firebase 官方文档概述了在 Firebase 实时数据库中查询列表的方法:firebase.google.com/docs/database/android/lists-of-data。另外,这里有一篇有用的文章概述了存储和查询:medium.com/a-practical-guide-to-firebase-on-android/… 【参考方案1】:

为了以后的读者,这里是 Kotlin 中所需的代码:

val products = arrayListOf<Product>()
        val ref = FirebaseDatabase.getInstance().getReference("products")
        ref.addValueEventListener(object : ValueEventListener 
            override fun onDataChange(dataSnapshot: DataSnapshot) 
                for (productSnapshot in dataSnapshot.children) 
                    val product = productSnapshot.getValue(Product::class.java)
                    products.add(product!!)
                
                System.out.println(products)
            

            override fun onCancelled(databaseError: DatabaseError) 
                throw databaseError.toException()
            
        )
    

你必须像这样在 Product 类中初始化变量:

data class Product(
val title:String = "",
val photo:String = "",
val description:String = "",
val price:Double = -1.0
)

如果你没有初始化就离开它,你会得到class does not define a no-argument constructor 错误

【讨论】:

【参考方案2】:

这样的事情应该可以解决问题:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("products");
ref.addListenerForSingleValueEvent(new ValueEventListener() 
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) 
        ArrayList<Product> products = new ArrayList<Product>();
        for (DataSnapshot productSnapshot: dataSnapshot.getChildren()) 
            Product product = productSnapshot.getValue(Product.class);
            products.add(product);
        
        System.out.println(products);
    

    @Override
    public void onCancelled(DatabaseError databaseError) 
        throw databaseError.toException();
    

需要注意的几点:

此代码会丢弃每个产品的密钥(JSON 中的p1p2)。如果您以后想要修改或删除产品,您可能需要这些密钥,因此应考虑将它们存储在您的 Product 类中。另见:Is there a way to store Key in class which I cast from Firebase object? 您真的应该为自己和我们在documentation reading up on listeners and queries 度过一段时间。

【讨论】:

以上是关于如何从 Firebase 中的实时数据库中获取数组的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Firebase 实时数据库中获取数据到 Flutter 中的列表中?

如何根据 Angular 6 中的 Firebase 实时数据库中的键获取单个记录

无法从 firebase 回收器视图中的 firebase 实时数据库中获取嵌套数据

如何从 firebase 实时数据库中获取子值?

如何从 Firebase 实时数据库中检索/获取项目

Swift 和 Firebase 实时数据库:如何获取对象的数量?