Java 通知用户Firebase数据库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

我想在插入id之前检查它是否已经存在(防止更新已经存在的id)。 这是我目前掌握的代码:

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数据库结构吗