【问题标题】:How can I get all the values from a key from Firebase Realtime DB?如何从 Firebase Realtime DB 的键中获取所有值?
【发布时间】:2019-09-19 06:38:57
【问题描述】:

我想从类别键中的键中获取所有值。

我使用的是 AndroidX,Gradle 5.1.1,我正在使用这个结构:

db-name
    category1
        unique_random_id: value
        unique_random_id2: value_value
    category2
        unique_random_id: value
        unique_random_id2: value_value
    ListView lv;
    FirebaseDatabase fb;
    DatabaseReference dr;

    ArrayList<Article> list;
    ArrayAdapter<Article> adapter;
    Article article;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.articlelist);

        Intent intent = getIntent();
        Bundle gotExtras = intent.getExtras();

        final TextView articleCatShow = (TextView)findViewById(R.id.articleCatShow);
        articleTopCat.setText(gotExtras.getString("cat"));

        article = new Article();
        lv = (ListView)findViewById(R.id.listView);
        fb = FirebaseDatabase.getInstance();
        dr = fb.getReference(gotExtras.getString("cat"));

        list = new ArrayList<>();
        adapter = new ArrayAdapter<Article>(this, R.layout.article_each, R.id.articleTxt, list);

        dr.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for(DataSnapshot ds: dataSnapshot.getChildren()) {
                    adapter.add(ds.getValue(Article.class));
                    lv.setAdapter(adapter);
                }
            }

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

            }
        });

    }

Gradle 依赖项:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    implementation 'com.google.firebase:firebase-analytics:17.2.0'
    implementation 'com.google.firebase:firebase-core:17.2.0'
    implementation 'com.google.firebase:firebase-database:19.1.0'
}

我希望列表视图有数据。

当我运行应用程序并按下将 Intent with Extras Can't convert an object of type java.lang.String to type &lt;my-hidden-package-name&gt; 的按钮时,我也会收到此错误

【问题讨论】:

  • 您传递的捆绑包中的 cat 值是多少?并且不要在 for 循环中设置适配器
  • @Priyankagb 我正在发送类别名称
  • 是字符串还是别的什么?
  • @Priyankagb 这是一个字符串

标签: java android firebase firebase-realtime-database androidx


【解决方案1】:

改变这个:

       dr.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for(DataSnapshot ds: dataSnapshot.getChildren()) {
                    adapter.add(ds.getValue(Article.class));
                    lv.setAdapter(adapter);
                }
            }

进入这个:

       dr.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    adapter.add(dataSnapshot.getValue(Article.class));
                    lv.setAdapter(adapter);
                }
            }

删除 for 循环,因为当您迭代时,您检索的值类型为 String,而不是您的包的类型。

【讨论】:

  • 很好,彼得。我读错了错误消息,所以认为它是将对象转换为字符串而不是反之亦然。
  • 我按照你说的做了,现在在我的 ListView 上,我得到一个项目,上面写着 &lt;my-private-package-name&gt;@91e228a
  • 是的,因为你应该这样做Article article = ds.getValue(Article.class); String name = article.getName(); adapter.add(name);@ItsBenny_
  • @ItsBenny_ @91e228a 这是您的对象Article 的哈希码,这意味着您正在检索它,但您应该访问您的类中的实例变量,所以如果您有让我们说setNamegetName 然后按照我告诉你的去做。如果您的变量已发布,则只需执行article.name(此处实例变量的名称不是name。)
  • @PeterHaddad adapter.add(name) 引发错误in ArrayAdapter cannot be applied to (java.lang.String) 名称:String name = article.getArticle();
【解决方案2】:

好的!我找到了答案。 对于这样的数据库结构

db-name:
    category:
        unique_id_very_random: value

我做的是

ArrayList<String> collectValues = new ArrayList<>();
for(DataSnapshot ds : dataSnapshot) {
    collectValues.add(ds.getValue(String.class));
}
adapter = new ArrayAdapter<String>(YOURACTIVITYJAVAFILENAME.this, R.layout.value_each, R.id.valuePerTxtValue, collectValues); // change YOURACTIVITYJAVAFILENAME to your java file name of the screen where you are showing the list and create a layout and put a textvalue inside the layout (basically its like how you want each items to look like, i think) and change 'R.layout.value_each' to 'R.layout.the_new_layout_name' and 'R.id.valuePerTxtValue' to the new text values name like 'R.id.text_value_name'
lv.setAdapter(adapter);

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 2018-06-25
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多