【问题标题】:Android Firebase: invalid case sensitive nameAndroid Firebase:区分大小写的名称无效
【发布时间】:2018-03-25 09:53:54
【问题描述】:

我正在尝试将 Track 类型对象添加到具有 Checkpoint 类型对象的 ArrayList 的 firebase 数据库中。

ssDB.child("tracks").child(trackKey).setValue(newTrack)

但我收到一个错误:

03-25 09:35:38.293 9189-9189/com.illbirdstudios.illbird.streetsend E/AndroidRuntime: FATAL EXCEPTION: main
 Process: com.illbirdstudios.illbird.streetsend, PID: 9189
 com.google.firebase.database.DatabaseException: Found setter with invalid case-sensitive name: setCheckpoints
     at com.google.android.gms.internal.zzelx.<init>(Unknown Source:403)
     at com.google.android.gms.internal.zzelw.zzf(Unknown Source:12)
     at com.google.android.gms.internal.zzelw.zzb(Unknown Source:756)
     at com.google.android.gms.internal.zzelw.zza(Unknown Source:0)
     at com.google.firebase.database.DataSnapshot.getValue(Unknown Source:10)
     at com.illbirdstudios.illbird.streetsend.CreateTrackActivity2$1$1.onDataChange(CreateTrackActivity2.java:174)
     at com.google.firebase.database.zzp.onDataChange(Unknown Source:7)
     at com.google.android.gms.internal.zzegf.zza(Unknown Source:13)
     at com.google.android.gms.internal.zzeia.zzbyc(Unknown Source:2)
     at com.google.android.gms.internal.zzeig.run(Unknown Source:65)
     at android.os.Handler.handleCallback(Handler.java:789)
     at android.os.Handler.dispatchMessage(Handler.java:98)
     at android.os.Looper.loop(Looper.java:164)
     at android.app.ActivityThread.main(ActivityThread.java:6541)
     at java.lang.reflect.Method.invoke(Native Method)
     at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)

这是我的赛道课

public class Track {

    private String trackOwner;
    private String trackName;

    public final static String POINTTOPOINT = "POINTTOPOINT";
    public final static String CIRCUIT = "CIRCUIT";

    private String trackType;
    private ArrayList<Checkpoint> checkpoints;

    public Track(String trackOwner, String trackName, String trackType){

        this.trackOwner = trackOwner;
        this.trackName = trackName;
        this.trackType = trackType;
        checkpoints = new ArrayList<Checkpoint>();

    }

    public Track(){

    }

    public String getTrackOwner(){
        return this.trackOwner;
    }

    public String getTrackName(){
        return this.trackName;
    }

    public String getTrackType(){
        return this.trackType;
    }

    public void setCheckpoints(ArrayList<Checkpoint> checkpoints){
        this.checkpoints = checkpoints;
    }

    public void addCheckPoint(Checkpoint checkpoint){
        checkpoints.add(checkpoint);
    }

    public ArrayList<Checkpoint> getCheckPoints(){
        return this.checkpoints;
    }
}

当我尝试通过对数据库的子调用单独添加每个 Track 项时,它可以工作:

Log.d("Saving Track", "Track Name");
ssDB.child("tracks").child(trackKey).child("trackName").setValue(newTrack.getTrackName());
Log.d("Saving Track", "Track Owner");
ssDB.child("tracks").child(trackKey).child("trackOwner").setValue(newTrack.getTrackOwner());
Log.d("Saving Track", "Track Type");
ssDB.child("tracks").child(trackKey).child("trackType").setValue(newTrack.getTrackType());
Log.d("Saving Track", "Track Checkpoints");
ssDB.child("tracks").child(trackKey).child("checkpoints").setValue(newTrack.getCheckPoints());

但不是当我将值设置为对象本身时。

ssDB.child("tracks").child(trackKey).setValue(newTrack)

【问题讨论】:

  • 至少 getter vs setter 和变量名不匹配。一个是CheckPoints,其他的是Checkpoints
  • 我认为 firebase 只保存了字符串(因为它使用 JSON 来存储数据)。您不能只是将一些任意对象设置为值吗?

标签: java android firebase firebase-realtime-database


【解决方案1】:

由于以下字段,您会收到此错误:

private ArrayList<Checkpoint> checkpoints;

正确的getter和setter应该是:

public ArrayList<Checkpoint> getCheckpoints() {
    return checkpoints;
}

public void setCheckpoints(ArrayList<Checkpoint> checkpoints) {
    this.checkpoints = checkpoints;
}

您的 getter 应该是 getCheckpoints() 而不是 getCheckPoints(),因为它在您的代码中。请参阅小写 p 与大写字母 P

【讨论】:

  • 啊我现在明白了,但我不明白为什么如果 P 是大写字母会很重要吗?比如编译器如何知道哪个字符需要大写?
  • 当 Firebase 实时数据库 SDK 反序列化来自数据库的对象时,正在寻找遵循 JavaBeans 原则并相应命名为 Java Naming Conventions 的字段。所以像checkpoints 这样的字段对应的getter 是getCheckpoints() 而不是getCheckPoints()。如果你使用了一个名为checkPoints 的字段,那么只有在这种情况下像getCheckPoints() 这样的getter 才会起作用。跨度>
【解决方案2】:

您的 setter 和 getter 应该遵循 Java Bean 的原则。目前你的 getter 和 setter 不匹配。

此外,请考虑不要使用 ArrayList 来存储数据列表,而是使用 Maps。在 Firebase 文档 here 中,您可以找到一些存储列表的最佳做法。

【讨论】:

    猜你喜欢
    • 2016-11-24
    • 1970-01-01
    • 2016-05-15
    • 2014-02-17
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    相关资源
    最近更新 更多