在我的数据库中,我有访客状态,当单击签入按钮时我想删除该状态,但它没有删除。 这是我的 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
)
}
}
我希望单击签入按钮时数据库中的状态会被删除。
要删除状态,请考虑在 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()
}
}