有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java通知用户Firebase数据库id是否存在

我想在插入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不存在时,它会同时显示两个祝酒词。但是,当它确实存在时,它只显示“它存在”一个

我如何显示“它存在”仅当id存在时才吐司/如何防止“它存在”当id不存在时显示的吐司

编辑:

Firebase数据库结构:

-DATABASE
    -ID
        -NAME
        -DESCRIPTION

共 (3) 个答案

  1. # 1 楼答案

    请这样做:

    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),因此您将同时获得Toast存在的和不存在的

    使用addListenerForSingleValueEvent则它将仅在您之前指定的id中迭代

  2. # 2 楼答案

    尝试用addListenerForSingleValueEvent替换addValueEventListener方法

    因为addValueEventListener可能会因为数据的变化而被调用两次,这就是它第一次显示同一id的Exist和than not Exist的原因

    对于addListenerForSingleValueEvent,firebase声明它应该:

    Read Data Once.

    In some cases it may be useful for a callback to be called once and then immediately removed. We've created a helper function to make this easy:

  3. # 3 楼答案

    像这样试试

    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();
        }
    });