android 如何使用id从Firebase RealTimeDatabase获取数据

mm9b1k5b  于 12个月前  发布在  Android
关注(0)|答案(1)|浏览(83)

我正在构建一个食品订购应用程序,我有一个CartItem列表

data class CartItemData(
  @PrimaryKey
  val cartItemId: String = UUID.randomUUID().mostSignificantBits.toString(),
  val userId: String,
  val foodId: String,
  val price: Double,
  val quantity: Int)

字符串
我想使用cartItem中的食物ID从Firebase Realtime Database中检索食物数据,然后将其显示给用户。
下面是我的代码从数据库中获取食物数据

fun getFood(
    foodId: String,
    onGetFoodSuccess: (FoodData) -> Unit
) {
    foodsRef.orderByChild("id").equalTo(foodId).addListenerForSingleValueEvent(object : ValueEventListener{
        override fun onDataChange(snapshot: DataSnapshot) {
            snapshot.children.forEach { shot ->
                Log.d(TAG, shot.value.toString())
                val data = shot.getValue(FoodData::class.java)
                data?.let(onGetFoodSuccess)
            }
        }

        override fun onCancelled(error: DatabaseError) {
        }

    })
}


这是我的购物车视图模型

class CartViewModel : ViewModel() {
  private val fireBaseRepository = FireBaseRepository.get()
  private val cartRepository = CartRepository.get()
  private val _cartState = MutableStateFlow(CartState())
  val cartState: StateFlow<CartState> = _cartState.asStateFlow()

  init {
      getCart()
  }

  fun getFood(
      foodId: String,
      onGetFoodSuccess: (FoodData) -> Unit
  ) {
      fireBaseRepository.getFood(
          foodId = foodId,
          onGetFoodSuccess = onGetFoodSuccess
      )
  }

  private fun getCart() {
      viewModelScope.launch {
          cartRepository.getCart().collect {cartItems ->
              _cartState.value = _cartState.value.copy(
                  cartItems = cartItems,
              )
          }
      }
  }
}


我不知道如何从实时数据库中检索数据,并在从SQLite数据库中获取购物车数据后将其传递到视图中。

0vvn1miw

0vvn1miw1#

首先,我强烈建议你检查firebase是否正确地在快照上检索,否则可能是你的配置有问题。此外,如果在这一点上:

// code ...

foodsRef.orderByChild("id").equalTo(foodId).addListenerForSingleValueEvent(object : ValueEventListener{
        override fun onDataChange(snapshot: DataSnapshot) {
            snapshot.children.forEach { shot ->
                Log.d(TAG, shot.value.toString())
                val data = shot.getValue(FoodData::class.java)
                data?.let(onGetFoodSuccess)
            }
        }

        override fun onCancelled(error: DatabaseError) {
        }

    })

//code ...

字符串
这个日志正在检索数据,我可以假设主要问题是这个Map:val data = shot.getValue(FoodData::class.java),可能你没有打得那么好,因为这个值是得到空的,而不是调用回调。我的建议是检查从firebase快照的结果,并检查您的数据类FoodData是否定义正确,提醒设置其默认值,否则该应用程序将崩溃.检查此文档的进一步解释.
现在,如果您的问题是处理回调以检索到ui,则更简单。您可以在compose视图中使用cartState,并将collect作为可组合对象的状态,因此每当此stateFlow更改其值时,可组合对象将重新绘制,请查看:https://developer.android.com/jetpack/compose/state#use-other-types-of-state-in-jetpack-compose

相关问题