繁体   English   中英

如何使用firebase更新android应用程序中的值?

[英]How to update values in android app using firebase?

嗨请找到firebase DB的结构?

在此处输入图片说明

现在让我们说,我们要从-LcKJ14wv-Y46QER1V- 0更新fNamelName

如何更新它们,以便仅更新这些值而不会在数据库中添加新值

我们写的代码

queryToGetData = FirebaseDatabase.getInstance().getReference().child(AppData.STUDENTS)
                    .orderByChild("studentUnique").equalTo(user.getUid()).limitToFirst(1);
            queryToGetData.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    if(!dataSnapshot.exists()){
                        db.push().setValue(ss);
                        Common.alertDialog("Added","Profile Details saved", StudentProfile.this);
                    } else {
                        db.setValue(ss);
                        Common.alertDialog("Oops","Profile Updated", StudentProfile.this);
                    }
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
                    Common.alertDialog("Oops","Something went wrong!", StudentProfile.this);
                }
            });

这段代码在做什么?

第一次运行更新时(整个集合为空)

在此处输入图片说明

*第二次运行更新时(同一用户)

在此处输入图片说明

第三次运行更新时(同一用户)

在此处输入图片说明

首先,我建议像这样重构您的数据库以进行更简单的查询。

students
    QslkALDJFLDFLFk(this is the student unique key or the uid)
        emailAddress:
        fName:

然后使用updateChildren()更新特定字段。

Student student = new Student("firstName", "lastName");
Map<String, Object> values = student.toMap();

queryToGetData = FirebaseDatabase.getInstance().getReference()
    .child(AppData.STUDENTS).child(user.getUid())
    .updateChildren(values);

你可以在这里阅读文档

我正在这样做;-

DatabaseReference receiverUserRef = FirebaseDatabase.getInstance().getReference(chatListTableName)
                .child(userId)
                .child(firebaseUser.getUid());

        receiverUserRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    receiverUserRef.child("time").setValue(String.valueOf(System.currentTimeMillis()));
                } else {
                    receiverUserRef.child("id").setValue(firebaseUser.getUid());
                    receiverUserRef.child("isGroup").setValue("false");
                    receiverUserRef.child("time").setValue(String.valueOf(System.currentTimeMillis()));
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

我同意@elbert rivas 关于使用uid来识别您的用户而不是推送 id 的说法。 在这种情况下,要更新用户对象,您不需要查询。 但是,如果无法更改您的数据库结构,您仍然可以像以下代码行一样更新用户对象:

queryToGetData = FirebaseDatabase.getInstance().getReference().child(AppData.STUDENTS)
                .orderByChild("studentUnique").equalTo(user.getUid());
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            Map<String, Object> map = new HashMap<>();
            map.put("fName", "newFirstName");
            map.put("lName", "newLastName");
            ds.getRef().updateChildren(map);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
queryToGetData.addListenerForSingleValueEvent(valueEventListener);

看,我删除了.limitToFirst(1)因为用户的uid是唯一的。 因此,即使我们删除该方法调用,您仍然会得到一个结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM