Reputation: 1113
I'm bloqued creating a Firebase Database.
I'm trying to model a class. A very simple class:
package com.glups.model;
import com.google.firebase.database.IgnoreExtraProperties;
@IgnoreExtraProperties
public class AlumnoFB {
private String nombre;
private String apellidos;
private String telefono;
private String email;
private Boolean tieneWhatsapp;
private Boolean tieneTelegram;
private Boolean tieneHangouts;
private Long formaPago;
private Double ratioHora;
private Double precioHora;
private Double horasCompensadas;
public AlumnoFB() {
// Default constructor required for calls to DataSnapshot.getValue(User.class)
}
public AlumnoFB(String nombre,
String apellidos,
String telefono,
String email,
Boolean tieneWhatsapp,
Boolean tieneTelegram,
Boolean tieneHangouts,
Long formaPago,
Double ratioHora,
Double precioHora,
Double horasCompensadas) {
this.nombre = nombre;
this.apellidos = apellidos;
this.telefono = telefono;
this.email = email;
this.tieneWhatsapp = tieneWhatsapp;
this.tieneTelegram = tieneTelegram;
this.tieneHangouts = tieneHangouts;
this.formaPago = formaPago;
this.ratioHora = ratioHora;
this.precioHora = precioHora;
this.horasCompensadas = horasCompensadas;
}
}
that is almost like a sample class from Firebase.
Application user obtained from getUser() has been logged on Firebase.
When I call SetValue:
AlumnoFB alumno = new AlumnoFB("", "", "", "", false, false, false, ((Integer)FormaPago.INT_NO_PAGADO).longValue(), 0.0, 0.0, 0.0);
mDatabase.child("AlumnoFB").child(ControlClasesFirebase.getUser().getUid()).setValue(alumno) ;
A fatal exception raises.
06-10 10:17:37.179 13841-13841/com.glups.controlclases E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.glups.controlclases, PID: 13841 com.google.firebase.database.DatabaseException: No properties to serialize found on class com.glups.model.AlumnoFB
at com.google.android.gms.internal.zzaix$zza.<init>(Unknown Source)
at com.google.android.gms.internal.zzaix.zzj(Unknown Source)
at com.google.android.gms.internal.zzaix.zzaw(Unknown Source)
at com.google.android.gms.internal.zzaix.zzav(Unknown Source)
at com.google.firebase.database.DatabaseReference.zza(Unknown Source)
at com.google.firebase.database.DatabaseReference.setValue(Unknown Source)
at com.glups.controlclases.MainActivity$4.onClick(MainActivity.java:305)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5258)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
I've checked types, and all are accepted. What's wrong?
Upvotes: 101
Views: 58532
Reputation: 852
Try This Solution!
1- Implement Serializable interface
class model implements Serializable {}
2- Class Model with Private properties with Constructor and public setter and getter methods
public class Message implements Serializable {
@ServerTimestamp
private Date created;
private String content;
private String from;
private String to;
public Message(Date created, String content, String from, String to) {
this.created = created;
this.content = content;
this.from = from;
this.to = to;
}
public Date getCreated() {
return created;
}
public void setCreated(Date created) {
this.created = created;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
}
3- add this code in Proguard rules as said here
# Add this global rule
-keepattributes Signature
# This rule will properly ProGuard all the model classes in
# the package com.yourcompany.models.
# Modify this rule to fit the structure of your app.
-keepclassmembers class com.yourcompany.models.** {
*;
}
Upvotes: 0
Reputation: 21
Verify this:
buildTypes {
release {
minifyEnabled false
...
}
debug {
minifyEnabled false
...
}
}
Upvotes: 2
Reputation: 5317
SOLUTION
In my case the issue was only in release/signed mode APK. So I fixed by doing these steps..
1- Added all model classes into proguaed rules like
-keep class com.YOUR_PACKAGE_NAME.modelClass.** { *; }
OR
@Keep
public class modelClass {}
2- Declared all variables of model class as private
3- Removed conflicting keys
Chill Pill :)
Upvotes: 4
Reputation: 37
To solve the issue as mentionned below you should declare the class as Serializable and for the code :
`data class Review(
var rating:Float=0f,
var userId:String="",
var textR:String="",
@ServerTimestamp var timestamp: Date? = null
):Serializable{
constructor( rating: Float,userId: String, text: String):this() {
this.userId = userId
this.rating = rating
this.textR = text
}
}`
Upvotes: 0
Reputation: 178
You can do either of the two things -
Upvotes: 0
Reputation: 1
adding
@ServerTimeStamp
public Date date;
helped me to resolve the issue
Upvotes: 0
Reputation: 6302
In case anyone runs into this and none of the above solutions work, the variables declared also need to be of Object
type and not raw types.
For example, you can use Integer
's but you cannot use int
's.
Same is true for boolean
, float
, double
, etc. Basically, any unboxed type.
Upvotes: 0
Reputation: 1780
I have got this issue today and just resolve this providing getter/setter for private variables.
ex:
private String pid;
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
Now it's work perfectly without any error. Hope it will help newbies devs.
Upvotes: 3
Reputation: 3131
In my case I forgot to add a proguard rule to keep the model classes:
-keep class com.google.firebase.example.fireeats.model.** { *; }
This is same as @aselims's answer, just proguard version.
I found it in the official firestore example:
https://github.com/firebase/quickstart-android/blob/master/firestore/app/proguard-rules.pro
Upvotes: 35
Reputation: 1893
If you are using proguard, some methods in the model could be stripped out depending on your configuration. As we know that there is no much optimization to POJO as it has only fields with getters and/or (optionally) setters, you can use the annotation "@Keep" so proguard will not delete any methods from this class.
Check this for more info: https://developer.android.com/studio/build/shrink-code.html
@Keep
public class Store {}
Upvotes: 125
Reputation: 21805
Firebase require your Pojo to have public variables or getter/setter.
Change variable declarations to public
public String nombre;
public String apellidos;
public String telefono;
public String email;
public Boolean tieneWhatsapp;
public Boolean tieneTelegram;
public Boolean tieneHangouts;
public Long formaPago;
public Double ratioHora;
public Double precioHora;
public Double horasCompensadas;
Upvotes: 188