com.google.firebase.database.DatabaseException

时间:2018-01-23 15:54:50

标签: android firebase firebase-realtime-database

当我开始活动时,它显示错误:

  

类com.rcpl.agni.Artist没有定义无参数   构造函数。如果您使用的是ProGuard,请确保这些构造函数   没被剥夺。

protected void onStart() {
        super.onStart();
        ref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                //artistList.clear();
                for(DataSnapshot artistSnapshot : dataSnapshot.getChildren()){
                    Artist artist = artistSnapshot.getValue(Artist.class);
                    Toast.makeText(MainActivity.this, artist.getArtistName(), Toast.LENGTH_SHORT).show();

                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

Artist.java

package com.rcpl.agni;

/**
 * Created by Dell-pc on 23-01-2018.
 */

public class Artist {
    String artistId;
    String artistName;
    String artistGenre;

    public Artist(String artistId, String artistName, String artistGenre) {
        this.artistId = artistId;
        this.artistName = artistName;
        this.artistGenre = artistGenre;
    }

    public String getArtistId() {
        return artistId;
    }

    public String getArtistName() {
        return artistName;
    }

    public String getArtistGenre() {
        return artistGenre;
    }
}

3 个答案:

答案 0 :(得分:3)

我认为错误是不言自明的。您只需要在Artist类中添加一个空构造函数:

package com.rcpl.agni;

/**
 * Created by Dell-pc on 23-01-2018.
 */

public class Artist {
    String artistId;
    String artistName;
    String artistGenre;

    public Artist(){}

    public Artist(String artistId, String artistName, String artistGenre) {
        this.artistId = artistId;
        this.artistName = artistName;
        this.artistGenre = artistGenre;
    }

    public String getArtistId() {
        return artistId;
    }

    public String getArtistName() {
        return artistName;
    }

    public String getArtistGenre() {
        return artistGenre;
    }
}

Firebase需要此构造函数才能在您调用artistSnapshot.getValue(Artist.class);

时使用它

答案 1 :(得分:2)

要解决此问题,您只需将public no-argument constructor添加到Artist课程。

public Artist() {}

请记住,当Firebase Realtime Database SDK反序列化来自数据库的对象时,它要求任何对象都具有公共无参数构造函数。这是实例化该特定对象所必需的。对象中的所有字段都是使用公共setter方法或直接访问公共成员来设置的。

如果您不使用公共的无参数构造函数,则SDK不知道如何创建该类的实例。大多数序列化库都有相同的要求。

答案 2 :(得分:0)

enter image description here

在Data类中添加非参数

enter image description here

运行带有清晰日志的应用程序:

enter image description here