热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何从Firebase中检索数据列表并将其存储到ArrayList<>

我有一个Firebase数据库,我想从那里检索数据列表并存储到ArrayList中。产品

我有一个Firebase数据库,我想从那里检索数据列表并存储到ArrayList中。

产品模型很好,可以正常工作。

class Product(var pName: String?,var pUnit: Int,var pPrice: Double,var pAmount: Double)

但是以某种方式我无法从数据库中获取“项目”列表。
我想要的是获取pnamepunitppricepamount并将其存储在ArrayList

如何从Firebase中检索数据列表并将其存储到ArrayList <>

我对数据库的引用是这个

ref = FirebaseDatabase.getInstance().getReference().child("Sales")
ref.addValueEventListener(object : ValueEventListener{
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(p0: Datasnapshot) {
var sira: Int = 0
ref.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(p1: Datasnapshot) {
println("onDataChange")
if (p0.exists()) {
list.clear()
for (h in p0.children) {
val dateR = h.child("date").value.toString()
val discountR = h.child("discount").value.toString()
val dueR = h.child("due").value.toString()
val nameR = h.child("name").value.toString()
val totalR = h.child("total").value.toString()
val subtotalR = h.child("subTotal").value.toString()
val timeR = h.child("time").value.toString()
val name = h.child("pname").value.toString()
val unit = h.child("punit").value.toString()
val price = h.child("pprice").value.toString()
val amount = h.child("pamount").value.toString()
productList.add(Product(name,unit.toInt(),price.toDouble(),amount.toDouble()))

这是json文件

{
"-Lw37--uyfuBA0AfTalp" : {
"date" : "14/12/2019","discount" : 0.24,"due" : 0,"items" : [ {
"pamount" : 2.4,"pname" : "Granola","pprice" : 2.4,"punit" : 1
} ],"paym" : [ {
"paymentAmnt" : 0.02,"paymentDesc" : "Cash Payment :"
},{
"paymentAmnt" : 2.14,"paymentDesc" : "Card Payment :"
} ],"subTotal" : 2.4,"time" : "11:16:42","total" : 2.16
},"-Lw5Qx8sVdw3ZCMiXAL-" : {
"date" : "14/12/2019","discount" : 1,"items" : [ {
"pamount" : 4.8,"punit" : 2
},{
"pamount" : 2.6,"pname" : "Brownie","pprice" : 2.6,"punit" : 1
},"punit" : 1
} ],"name" : "James Brown","paym" : [ {
"paymentAmnt" : 3,"paymentDesc" : "Cash Payment :"
},{
"paymentAmnt" : 5,"paymentDesc" : "Staff Markout :"
},{
"paymentAmnt" : 1,"subTotal" : 10,"time" : "22:03:07","total" : 9
},"-Lw5T4TfYUTXsWKAndBx" : {
"date" : "14/12/2019","due" : -0.84,"paymentDesc" : "Cash Payment :"
} ],"time" : "22:12:26","-Lw5UWguHS18IwWE6elT" : {
"date" : "14/12/2019","discount" : 0.26,"due" : -1.66,"items" : [ {
"pamount" : 2.6,"paym" : [ {
"paymentAmnt" : 4,"subTotal" : 2.6,"time" : "22:18:43","total" : 2.34
},"-Lw5ypp5xJLJO53bjejk" : {
"date" : "15/12/2019","discount" : 0,"due" : -1.6,"paymentDesc" : "Cash Payment :"
} ],"time" : "00:35:32","total" : 2.4
},"-LwANPC0UYCmTnqm7DRV" : {
"date" : "15/12/2019","punit" : 1
},{
"pamount" : 2.4,"paym" : [ {
"paymentAmnt" : 5,{
"paymentAmnt" : 4,"time" : "21:05:43","total" : 9
}
}

但是,请帮助我在这里做错了什么。任何帮助表示赞赏。

谢谢。



您可以尝试:使用GenericTypeIndicator获取列表数据。

您可以引用我的github:https://github.com/vancuong0429/stack_59350042

private lateinit var database: DatabaseReference
private var productList: ArrayList = arrayListOf()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
database = FirebaseDatabase.getInstance().getReference("Sales")
database.addValueEventListener(object: ValueEventListener {
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(p0: DataSnapshot) {
productList.clear()
for (snapshot in p0.children) {
if (snapshot.hasChild("items")) {
val generic: GenericTypeIndicator> =
object : GenericTypeIndicator>() {}
val items = snapshot.child("items").getValue(generic)
items?.let { productList.addAll(it) }
}
}
}
})
}
class Product {
var pName: String? = null
var pUnit: Int? = null
var pPrice: Double? = null
var pAmount: Double? = null
}


推荐阅读
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 【问题】在Android开发中,当为EditText添加TextWatcher并实现onTextChanged方法时,会遇到一个问题:即使只对EditText进行一次修改(例如使用删除键删除一个字符),该方法也会被频繁触发。这不仅影响性能,还可能导致逻辑错误。本文将探讨这一问题的原因,并提供有效的解决方案,包括使用Handler或计时器来限制方法的调用频率,以及通过自定义TextWatcher来优化事件处理,从而提高应用的稳定性和用户体验。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • 在Android开发中,实现多点触控功能需要使用`OnTouchListener`监听器来捕获触摸事件,并在`onTouch`方法中进行详细的事件处理。为了优化多点触控的交互体验,开发者可以通过识别不同的触摸手势(如缩放、旋转等)并进行相应的逻辑处理。此外,还可以结合`MotionEvent`类提供的方法,如`getPointerCount()`和`getPointerId()`,来精确控制每个触点的行为,从而提升用户操作的流畅性和响应性。 ... [详细]
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • 在分析和解决 Keepalived VIP 漂移故障的过程中,我们发现主备节点配置如下:主节点 IP 为 172.16.30.31,备份节点 IP 为 172.16.30.32,虚拟 IP 为 172.16.30.10。故障表现为监控系统显示 Keepalived 主节点状态异常,导致 VIP 漂移到备份节点。通过详细检查配置文件和日志,我们发现主节点上的 Keepalived 进程未能正常运行,最终通过优化配置和重启服务解决了该问题。此外,我们还增加了健康检查机制,以提高系统的稳定性和可靠性。 ... [详细]
  • 本文详细介绍了在 Oracle 数据库中使用 MyBatis 实现增删改查操作的方法。针对查询操作,文章解释了如何通过创建字段映射来处理数据库字段风格与 Java 对象之间的差异,确保查询结果能够正确映射到持久层对象。此外,还探讨了插入、更新和删除操作的具体实现及其最佳实践,帮助开发者高效地管理和操作 Oracle 数据库中的数据。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • Squaretest:自动生成功能测试代码的高效插件
    本文将介绍一款名为Squaretest的高效插件,该工具能够自动生成功能测试代码。使用这款插件的主要原因是公司近期加强了代码质量的管控,对各项目进行了严格的单元测试评估。Squaretest不仅提高了测试代码的生成效率,还显著提升了代码的质量和可靠性。 ... [详细]
  • DRF框架中Serializer反序列化验证机制详解:深入探讨Validators的应用与优化
    在DRF框架的反序列化验证机制中,除了基本的字段类型和长度校验外,还常常需要进行更为复杂的条件限制校验。通过引入`validators`模块,可以实现自定义校验逻辑,如唯一字段校验等。本文将详细探讨`validators`的使用方法及其优化策略,帮助开发者更好地理解和应用这一重要功能。 ... [详细]
author-avatar
我是王健值得信赖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有