我想删除firebase数据库中guests中的guest状态节点

问题描述 投票:0回答:1

在我的数据库中,我有访客状态,当单击签入按钮时我想删除该状态,但它没有删除。 这是我的 shareViewModel

class ShareViewModel: ViewModel() {
    var firstName : MutableState<String?> = mutableStateOf(null)

    private val _selectedGuest = MutableLiveData<Guest>()
    val selectedGuest: LiveData<Guest> get() = _selectedGuest

    fun setSelectedGuest(guest: Guest) {
        _selectedGuest.value = guest
    }

    // Function to update the status in Firebase
    fun updateGuestStatus(status: String) {
        val currentGuest = _selectedGuest.value
        currentGuest?.let {
            it.status = status
            updateStatusInFirebase(it)
            _selectedGuest.value = it
        }
    }

    // Function to delete the guest's status in Firebase
    fun deleteGuestStatus() {
        val currentGuest = _selectedGuest.value
        currentGuest?.let {
            it.status = ""// Set status to null to indicate deletion
            Log.d("DeleteGuestStatus", "Deleting status for guest: ${it.id}")
            updateStatusInFirebase(it)
            _selectedGuest.value = it
        }
    }

    // Function to get the guest's current status
    fun getGuestStatus(): String? {
        return _selectedGuest.value?.status
    }

    private fun updateStatusInFirebase(guest: Guest) {
        val user = FirebaseAuth.getInstance().currentUser
        val userUid = user?.uid

        if (userUid != null) {
            val database = FirebaseDatabase.getInstance()
            val guestsRef = database.getReference("users/$userUid/guests")

            // Assuming that 'guest.id' contains the unique identifier of the guest
            val guestId = guest.id

            // Use setValue(null) to remove the "status" field
            guestsRef.child(guestId).child("status").setValue(null)
        }
    }
}

还有我的 SecurityScreen,我想在其中签入按钮来删除我的 firebase 中的访客状态

@Composable
fun SecurityScreen(navController: NavController, shareViewModel: ShareViewModel) {

    var guests by remember {
        mutableStateOf<List<Guest>>(emptyList())
    }
    var selectedGuest by remember { mutableStateOf<Guest?>(null) }
    val database = FirebaseDatabase.getInstance()
    val usersRef = database.getReference("users")

    LaunchedEffect(usersRef) {
        // Add a listener for all users
        usersRef.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                val allGuests = mutableListOf<Guest>()

                // Iterate through each user's guests
                for (userSnapshot in snapshot.children) {
                    val guestsSnapshot = userSnapshot.child("guests")
                    for (guestSnapshot in guestsSnapshot.children) {
                        val guest = guestSnapshot.getValue(Guest::class.java)
                        guest?.let { allGuests.add(it) }
                    }
                }

                // Update the guest list
                guests = allGuests
            }

            override fun onCancelled(error: DatabaseError) {
                // Handle any errors here if needed
            }
        })
    }

    fun deleteGuestStatus(guest: Guest) {
        shareViewModel.setSelectedGuest(guest)
        shareViewModel.deleteGuestStatus()
    }



    Column(modifier = Modifier.padding(16.dp)) {
        Text(
            text = "Security Department",
            modifier = Modifier
                .padding(bottom = 16.dp)
                .fillMaxWidth(),
            fontSize = 20.sp,
            fontWeight = FontWeight.Bold,
            textAlign = TextAlign.Center
        )

        LazyColumn(
            content = {
                items(
                    items = guests.chunked(4), // Group guests into pairs (2 per row)
                    itemContent = { rowItems ->
                        Row(modifier = Modifier.fillMaxWidth(),
                            horizontalArrangement = Arrangement.SpaceEvenly) {
                            rowItems.forEach { guest ->
                                GridItem(
                                    guest = guest,
                                    onClick = { selectedGuest = guest },
                                    onCheckInClick =  { deleteGuestStatus(guest) }
                                )
                            }
                        }
                    }
                )
            }
        )
        // Display a dialog when a guest card is clicked
        selectedGuest?.let { guest ->
            Dialog(
                onDismissRequest = { selectedGuest = null },
                properties = DialogProperties(
                    dismissOnBackPress = true,
                    dismissOnClickOutside = true
                )
            ) {

                Column(
                    modifier = Modifier
                        .padding(16.dp)
                        .clip(RoundedCornerShape(10.dp))
                        .background(MaterialTheme.colorScheme.background)
                        .fillMaxWidth()
                ) {
                    Text(
                        text = "Name: ${guest.name}",
                        fontSize = 18.sp,
                        fontWeight = FontWeight.Bold,
                        modifier = Modifier.padding(8.dp)
                    )
                    Text(
                        text = "Contact: ${guest.phoneNumber}",
                        fontSize = 18.sp,
                        modifier = Modifier.padding(
                            start = 8.dp,
                            end = 8.dp,
                            bottom = 16.dp
                        )
                    )
                    Row(
                        verticalAlignment = Alignment.CenterVertically,
                        modifier = Modifier,
                    ) {
                        TextButton(onClick = {
                            // Update the status to "In" when Check In is clicked
                            deleteGuestStatus(guest)
                        }) {
                            Text(text = "Check In",
                                fontSize = 20.sp,
                                fontWeight = FontWeight.Bold,)
                        }
                        Spacer(modifier = Modifier.weight(1f))
                        TextButton(onClick = { /*TODO*/ }) {
                            Text(text = "Check Out",
                                fontSize = 20.sp,
                                fontWeight = FontWeight.Bold,)
                        }
                    }

                }
            }
        }
    }
}

@Composable
fun GridItem(guest: Guest, onClick: () -> Unit, onCheckInClick: () -> Unit) {

    Card(
        shape = CircleShape,
        colors = CardDefaults.cardColors(
            containerColor = MaterialTheme.colorScheme.primary
        ),
        modifier = Modifier
            .size(75.dp)
            .padding(8.dp)
            .clickable(onClick = onClick)
    ) {
        Text(
            text = guest.randomNumbers.joinToString(","),
            modifier = Modifier
                .fillMaxSize()
                .wrapContentSize(Alignment.Center),
            fontSize = 18.sp,
            fontWeight = FontWeight.Bold,
            textAlign = TextAlign.Center,
            color = MaterialTheme.colorScheme.onPrimary
        )
    }
}

我希望单击签入按钮时数据库中的状态会被删除。

enter image description here

android firebase kotlin firebase-realtime-database
1个回答
0
投票

要删除状态,请考虑在 Firebase 中使用

removeValue()
,因为将值设置为
null
可能无法按预期工作。修改
updateStatusInFirebase
中的
ShareViewModel
函数:

private fun updateStatusInFirebase(guest: Guest) {
    val user = FirebaseAuth.getInstance().currentUser
    val userUid = user?.uid

    if (userUid != null) {
        val database = FirebaseDatabase.getInstance()
        val guestsRef = database.getReference("users/$userUid/guests")

        val guestId = guest.id

        // Use removeValue() to delete the "status" field
        guestsRef.child(guestId).child("status").removeValue()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.