如何在Firebase数据库Android中添加新子项

时间:2016-10-13 05:39:17

标签: android firebase firebase-realtime-database

我尝试使用DatabaseReference Android应用中的Firebase添加新的孩子。我正在做:

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference() 
mDatabase.child("childToAdd").setValue(1);

我可以使用常规Firebase引用来执行此操作,因为它会将子项添加到数据库中(如果不存在)。
我怎么能用DatabaseReference来做这件事?

编辑:感谢您提出的所有建议,但我遇到以下问题的问题。当它进入if块时,它不会将数据推送到数据库。

https://gist.github.com/rounaksalim95/a5cba332400c6caf8320f15b0cbf06e8

当我使用旧的Firebase参考尝试此操作时,我得到错误代码11(从firebase runloop调用的用户代码),并且使用新的数据库引用我得到错误代码-3(PermissionDenied,即使我没有安全规则)。

更新

我让它做我想要使用单值事件监听器的事情:

Firebase userRef = new Firebase(BASEURL + "userData");

userRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.child(user.getUid()).getValue() == null) {
            userRef.child(user.getUid()).setValue(1);
        }
    }

    @Override
    public void onCancelled(FirebaseError firebaseError) {

    }
});  

但是数据库引用不允许我添加这样的值。

7 个答案:

答案 0 :(得分:22)

您需要致电push()为新数据生成唯一密钥:

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference() 
mDatabase.push().setValue(1);

这会将新值附加到列表的末尾。

通过组合push()child()方法,您可以在数据库中创建多个子项列表:

mDatabase.child("numbers").push().setValue(1);
mDatabase.child("numbers").push().setValue(53);
mDatabase.child("numbers").push().setValue(42);

mDatabase.child("letters").push().setValue("a");
mDatabase.child("letters").push().setValue("z");
mDatabase.child("letters").push().setValue("c");

请参阅Firebase文档中的append to a list of data部分。

答案 1 :(得分:2)

提到的另一篇文章是检查您的gradle app文件,以确保您拥有最新版本的Firebase,如下所示:

compile 'com.google.firebase:firebase-core:10.0.1'
compile 'com.google.firebase:firebase-database:10.0.1'

我认为这应该解决使用旧版本可能产生的许多问题。

我希望这会有所帮助。

答案 2 :(得分:1)

如果您未获得授权,则无法向数据库添加任何内容。您可以执行以下操作之一:

将其设置为firebase控制台中的规则选项卡:

{
"rules": {
".read": true,
".write": true
}
}

或者您必须先创建身份验证(尝试使用电子邮件/传递)并使用

创建用户
createUserWithEmailAndPassword(email, password)

然后使用以下地址登录:

signInWithEmailAndPassword(email, password)

您还需要在控制台中启用使用电子邮件/通行证登录。

然后您可以将数据写入数据库。

答案 3 :(得分:1)

在firebase中设置值之前使用push()。每次在数据库中发送值时,它都会创建新用户。

答案 4 :(得分:0)

检查此示例,它可能会帮助您。

     public class FirebaseUserDetails
    {
    private String mDisplayName;
    public String getmDisplayName() {
        return mDisplayName;
    }
public void setmDisplayName(String mDisplayName) {
    this.mDisplayName = mDisplayName;
}
}

将您的值添加到firebase数据库,

FirebaseUserDetails firebaseUserDetails = new FirebaseUserDetails();
firebaseUserDetails.setmDisplayName("arunwin");
DatabaseReference pathReference = FirebaseDatabase.getInstance().getReference().child("contacts");
pathReference.child("arun").setValue(firebaseUserDetails).addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {

    }
});

您的结果值将添加到您的数据库中,如下所示

contacts:
    arun:
        mDisplayName:"arunwin"

答案 5 :(得分:0)

在我的情况下,我正在添加这样的新孩子!

注意:我在这里向我的refresh_token

添加新的孩子firebase database
FirebaseDatabase.getInstance().getReference().child("RegistrationModel").child(userId)
                    .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    Map<String, String> stringStringHashMap =(Map<String, String>) dataSnapshot.getValue();

                    stringStringHashMap.put("refresh_token",refreshedToken);

                    FirebaseDatabase.getInstance().getReference().child("RegistrationModel").child(userId)
                            .setValue(stringStringHashMap);

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

答案 6 :(得分:-1)

在下面的代码中,我将一个名为deepak的子项添加到我的数据库中,然后再添加一个包含名称列表的子项。通过你的代码,我猜你已经知道如何在数据库中添加子项,你只是有点困惑。

private DatabaseReference childRef;
private DatabaseReference listRef;

databaseReference = FirebaseDatabase.getInstance().getReference();
childRef = databaseReference.child("deepak");
listRef = childRef.child("list");
listRef.setValue(callList);