Java 通知用户Firebase数据库id是否存在
我想在插入id之前检查它是否已经存在(防止更新已经存在的id)。 这是我目前掌握的代码:Java 通知用户Firebase数据库id是否存在,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我想在插入id之前检查它是否已经存在(防止更新已经存在的id)。 这是我目前掌握的代码: database.child(id).addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if (dataSnapshot.exists()) { Toast.makeText(g
database.child(id).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
Toast.makeText(getApplicationContext(), "it exists.", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(getApplicationContext(), "it's OK.", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(getApplicationContext(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
}
});
问题是,当id不存在时,它会同时显示两个祝酒词。但是,当它确实存在时,它只显示“它存在”一词
如何显示“it exists.”仅当id存在时才显示?如何防止id不存在时显示“it exists.”toast
编辑:
Firebase数据库结构:
-DATABASE
-ID
-NAME
-DESCRIPTION
尝试将您的
addValueEventListener
方法替换为addListenerForSingleValueEvent
因为可能会调用两次addValueEventListener
,因为数据发生了变化,这就是它第一次显示相同id的存在和不存在的原因
对于addListenerForSingleValueEvent
firebase声明它应该:
读取数据一次
在某些情况下,反复调用回调可能很有用
然后立即移除。我们已经创建了一个帮助函数来实现这一点
简单:
尝试将您的
addValueEventListener
方法替换为addListenerForSingleValueEvent
因为可能会调用两次addValueEventListener
,因为数据发生了变化,这就是它第一次显示相同id的存在和不存在的原因
对于addListenerForSingleValueEvent
firebase声明它应该:
读取数据一次
在某些情况下,反复调用回调可能很有用
然后立即移除。我们已经创建了一个帮助函数来实现这一点
简单:
请这样做:
database.child(id).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
Toast.makeText(getApplicationContext(), "it exists.", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(getApplicationContext(), "it's OK.", Toast.LENGTH_SHORT).show();
}
}
由于valueeventListener
将迭代所有子项(id),因此您将同时获得exists和notexists的Toast
使用addListenerForSingleValueEvent
时,它将仅在您之前指定的id中迭代。请执行以下操作:
database.child(id).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
Toast.makeText(getApplicationContext(), "it exists.", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(getApplicationContext(), "it's OK.", Toast.LENGTH_SHORT).show();
}
}
由于valueeventListener
将迭代所有子项(id),因此您将同时获得exists和notexists的Toast
使用addListenerForSingleValueEvent,它将只在您之前指定的id中迭代。像这样尝试
database.child(id).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue()!=null) {
Toast.makeText(getApplicationContext(), "it exists.", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(getApplicationContext(), "it's OK.", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(getApplicationContext(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
}
});
像这样试试
database.child(id).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue()!=null) {
Toast.makeText(getApplicationContext(), "it exists.", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(getApplicationContext(), "it's OK.", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(getApplicationContext(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
}
});
你能分享firebase数据库结构吗你能分享firebase数据库结构吗