从 Firebase 获取 Parcelable

Get Parcelable from Firebase

所以我一直在使用 firebase 数据库来存储一些使用 Parcelables 的用户数据。现在,当我尝试获取那些 parcelables 时,我收到此错误消息,指出我正在使用的 class 没有不带参数的构造函数。添加该构造函数并不能真正解决任何问题。有没有其他方法可以在不实际解析信息的情况下从数据库中获取 parcelables "by hand"?

大家干杯!

这只是我插入数据库的一个条目

AlarmParcel favorite = new AlarmParcel("id", "address", "name", "range", "units", latLng);
final ArrayList<AlarmParcel> favoriteList = new ArrayList<>();

当我检索该数据时

mMessagesDatabaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {

    for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
        AlarmParcel alarm = postSnapshot.getValue(AlarmParcel.class);
        favoriteList.add(alarm);
    }

        mAdapter.setmAlarmData(favoriteList);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        System.out.println("The read failed: " + databaseError.getCode());
    }
});

Aa 最后是 Alarm Parcelable(不包括 getter 和 setter)

public class AlarmParcel implements Parcelable {
private String mId;
private String mAddress;
private String mName;
private String mRange;
private String mUnits;
private LatLng mPosition;

public AlarmParcel(String id, String address, String name, String range, String units, LatLng position)
{
    this.mId = id;
    this.mName = name;
    this.mAddress = address;
    this.mRange = range;
    this.mUnits = units;
    this.mPosition = position;
}

private AlarmParcel(Parcel in){
    mId = in.readString();
    mAddress = in.readString();
    mName = in.readString();
    mRange = in.readString();
    mUnits = in.readString();
    mPosition = in.readParcelable(LatLng.class.getClassLoader());
}

@Override
public int describeContents() {
    return 0;
}

public String toString() { return mId + "--" + mAddress + "--" + mName + "--" + mRange + "--" + mUnits + "--" + mPosition; }

@Override
public void writeToParcel(Parcel parcel, int i) {
    parcel.writeString(mId);
    parcel.writeString(mAddress);
    parcel.writeString(mName);
    parcel.writeString(mRange);
    parcel.writeString(mUnits);
    parcel.writeParcelable(mPosition, PARCELABLE_WRITE_RETURN_VALUE);
}

public static final Parcelable.Creator<AlarmParcel> CREATOR = new Parcelable.Creator<AlarmParcel>() {
    @Override
    public AlarmParcel createFromParcel(Parcel parcel) {
        return new AlarmParcel(parcel);
    }

    @Override
    public AlarmParcel[] newArray(int i) {
        return new AlarmParcel[i];
    }

};

需要a constructor with no arguments

意思是empty constructor,所以就加上让她满意

public AlarmParcel(){}

解决了。这有点棘手。

除了添加不带参数的构造函数之外,parcelable 还需要 setter...但这些是区分大小写的。因此,当您从 firebase 获得查询时,它可能会寻找 setname 方法来构建您的 parcelable 而不是 setName,这是一个更通用名称。

希望这对某些人有所帮助。