【问题标题】:How to retrieve data from Real Time Database(Firebase) of anonymous path如何从匿名路径的实时数据库(Firebase)中检索数据
【发布时间】:2018-06-20 09:21:07
【问题描述】:

我在实时数据库(“体育”)中有一个路径,其中数据将使用 setValue 在用户声明的子名称下设置。如何从数据库中获取字符串。 示例-: 用户在 EditText 中写入一个名为 userWrite 的字符串,然后-:

mDatabase = FirebaseDatabase.getInstance().getReference("sports");
mDatabase.setValue.child(userWrite).setValue("Socks");

由于要检索的字符串必须已经使用 ignoreExtraProperties 在“Strings.class”中定义,当我无法在 Strings.class 文件中将数据声明为字符串将由用户提供? (这是我项目算法工作所必需的)

更新-: 用户可以创建 userWrite 并将其添加到数据库的次数不受限制,因此我需要一种方法,该方法允许我直接搜索某个字符串,而无需在 Strings.class 中声明它,我怀疑这是可能的,或者我需要一种方法,在该方法中我可以在另一个 Activity 中声明字符串并使用 get 方法 String check=AnotherClass.userWrite

数据树-:

Firebase-root
   |
   --- sports
         |
         --- pushID
            |
            ---userWrite
               |
                ---pushID-UserWrittenText

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    要解决这个问题,你可以改变这行代码:

    mDatabase.setValue.child(userWrite).setValue("Socks");
    

    mDatabase.child("userWrite").setValue(userWrite);
    

    假设用户在EditText中写入了字符串Socks,你的数据库结构将如下所示:

    Firebase-root
       |
       --- sports
             |
             --- userWrite: "Socks"
    

    现在要获取userWrite 属性的值Socks,请使用以下代码:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference userWriteRef = rootRef.child("sports").child("userWrite");
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String userWrite = dataSnapshot.getValue(String.class);
            Log.d("TAG", userWrite);
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    userWriteRef.addListenerForSingleValueEvent(valueEventListener);
    

    根据您的评论,我建议您创建一个地图并使用push() 这样的方法:

    mDatabase.child("userWrites").push().setValue(userWrite);
    

    在这种情况下,您的数据库结构将如下所示:

    Firebase-root
       |
       --- sports
             |
             --- userWrites
                   |
                   --- pushedIdOne: "Socks"
                   |
                   --- pushedIdTwo: "Another Pair of Socks"
                   |
                   --- //and so on
    

    要获取所有这些新创建的属性的值,请使用以下代码:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference userWritesRef = rootRef.child("sports").child("userWrites");
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                String userWrite = ds.getValue(String.class);
                Log.d("TAG", userWrite);
            }
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    userWritesRef.addListenerForSingleValueEvent(valueEventListener);
    

    【讨论】:

    • 感谢您的回答,但是用户写入的数量是无限的,可能有 1 个或 100 个,所以要检查每一个,我不能将它们命名为同一个孩子,因为它们可能会覆盖
    • 我应该在我的 Strings.class 文件中声明什么?
    • 不,没有必要这样做,因为您直接在引用上设置字符串值。好的,请随时通知我。
    • 我的数据树看起来像这样,sports-->PUSHid-->"userWrite"--> PushID(newID) -->userWrittenString ...因为它与我提到的你的答案不同不工作,这可能是因为我提到的数据略有不同,你能检查一下为什么它不能工作吗?...不工作= Log.d 不发送任何信息
    • 您应该使用这行代码:mDatabase.child("userWrites").push().setValue(userWrite); 添加,正如我的回答中已经提到的。所以会有sports->userWrites->pushedId->userWrittenString。所以在你的情况下,你错过了一个孩子。我给了你这个数据库结构,因为你的数据库结构是不可能实现的。原因是你错过了一个孩子。请看第二个数据库结构。
    猜你喜欢
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 2019-04-16
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多