如何在自定义关键子代中创建子代?

时间:2019-09-12 13:02:00

标签: java android firebase firebase-realtime-database

我正在尝试在子-LoVaDPuBRr4K2JSkc_j中创建子,但是如何?

Structure in my Firebase

代码:

firebaseAuth = FirebaseAuth.getInstance();
firebaseDatabase = FirebaseDatabase.getInstance();
databaseDocument = firebaseDatabase.getReference(firebaseAuth.getUid()).child("Document");

3 个答案:

答案 0 :(得分:2)

要在-LoVaDPuBRr4K2JSkc_j中创建孩子,您可以执行以下操作:

databaseDocument.child("-LoVaDPuBRr4K2JSkc_j").child("newProperty").setValue("new value");

如果您想使用自动生成的密钥生成一个新子代,则为:

databaseDocument.child("-LoVaDPuBRr4K2JSkc_j").push().setValue("new value");

这两个方法均假设您知道代码中的-LoVaDPuBRr4K2JSkc_j值。为了能够添加子项,这是必需的,因为写入数据库中的某个位置需要您知道该位置的完整路径。

您当然不想对该密钥进行硬编码,因此有两个常见的选项可以拥有该密钥:

  1. 从加载数据的那一刻开始将其传递到您的应用程序中。
  2. 使用该节点的其他一些值,该值允许您在数据库上执行查询以查找键。

答案 1 :(得分:0)

-LoVaDPuBRr4K2JSkc_j对象中添加新属性的最简单解决方案是使用在您的引用中推送ID的方式,如以下代码行:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference ref = rootRef.child(uid).child("Document").child("-LoVaDPuBRr4K2JSkc_j");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        dataSnapshot.getRef().child("newProperty").setValue("newValue");
    }

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

编辑:

根据您的评论,如果您有多个键,则应使用查询。以下代码可以解决问题:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child(uid).child("Document").orderByChild("inspectorName").equalTo("Test");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            ds.getRef().child("newProperty").setValue("newValue");
        }
    }

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

答案 2 :(得分:0)

我的代码及其工作:

    firebaseAuth = FirebaseAuth.getInstance();
    firebaseDatabase = FirebaseDatabase.getInstance();
    databaseProduct = firebaseDatabase.getReference(firebaseAuth.getUid()).child("Document");

        String id = databaseProduct.push().getKey();
        final String productID = databaseProduct.child(id).child("Product").push().getKey();
        final Items items = new Items(productID, dates, nameInspector, locate, product, priceProduct, amount, code);

        databaseProduct.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot getDocumentKey : dataSnapshot.getChildren()) {

                    String getDocumentID = getDocumentKey.getKey();
                    String sameDocumentID = getDocumentKey.child("documentID").getValue().toString();

                    if (getDocumentID.contentEquals(sameDocumentID)) {

                        databaseProduct.child(getDocumentID).child("Product").child(productID).setValue(items);
                    }

                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });