我一直试图简单地将具有两个变量(字符串和位置)的类推入并读取到Firebase上,而我却遇到了此错误.
**com.Google.firebase.database.DatabaseException: Class androID.location.Location does not define a no-argument constructor. If you are using ProGuard, make sure these constructors are not stripped. at com.Google.androID.gms.internal.zzeas.zze(UnkNown Source:51) at com.Google.androID.gms.internal.zzear.zzb(UnkNown Source:772) at com.Google.androID.gms.internal.zzear.zza(UnkNown Source:312) at com.Google.androID.gms.internal.zzear.zzb(UnkNown Source:0) at com.Google.androID.gms.internal.zzeas.zze(UnkNown Source:209) at com.Google.androID.gms.internal.zzear.zzb(UnkNown Source:772) at com.Google.androID.gms.internal.zzear.zza(UnkNown Source:0) at com.Google.firebase.database.DataSnapshot.getValue(UnkNown Source:10) at com.example.vish.mcapp.Selection.onDataChange(Selection.java:85) at com.Google.firebase.database.zzp.onDataChange(UnkNown Source:7) at com.Google.androID.gms.internal.zzduz.zza(UnkNown Source:13) at com.Google.androID.gms.internal.zzDWu.zzbvb(UnkNown Source:2) at com.Google.androID.gms.internal.zzdxa.run(UnkNown Source:65) at androID.os.Handler.handleCallback(Handler.java:790) at androID.os.Handler.dispatchMessage(Handler.java:99) at androID.os.Looper.loop(Looper.java:164) at androID.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.androID.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:807)**
我尝试从Firebase推送和读取其对象的类如下.
public class DeviceDetails { String nickname; Location location = new Location("Test"); DeviceDetails() { } DeviceDetails(String nickname) { this.nickname = nickname; location.setLatitude(0.0); location.setLongitude(0.0); location.setTime(new Date().getTime()); } DeviceDetails(String nickname, Location l) { this.nickname = nickname; location=l;}}
将数据推送到Firebase中就可以了.但是,如果没有遇到以上错误,我将无法阅读.
我编写的写入Firebase的代码是:-
register.setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw vIEw) { if(TextUtils.isEmpty(nickname.getText().toString())) { Toast.makeText(Selection.this, "Nickname can't be empty", Toast.LENGTH_SHORT).show(); return; } else { Location loc = new Location(""); loc.setLatitude(19.0); loc.setLongitude(29.5); loc.setTime(new Date().getTime()); DeviceDetails newDevice = new DeviceDetails(nickname.getText().toString(), loc); mDatabase.child("Phones").child(nickname.getText().toString().trim().replaceAll("\s","")).setValue(newDevice); } } });
我编写的要从Firebase读取的代码,我认为是罪魁祸首是:-
retrIEve.setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw vIEw) { DatabaseReference database = FirebaseDatabase.getInstance().getReference(); DatabaseReference myRef = database.child("Phones"); myRef.child(nickToRetrIEve.getText().toString().trim().replaceAll("\s", "")).addListenerForSingleValueEvent(new ValueEventListener() { @OverrIDe public voID onDataChange(DataSnapshot dataSnapshot) { DeviceDetails dev = dataSnapshot.getValue(DeviceDetails.class); double latitude = dev.location.getLatitude(); double longitude = dev.location.getLongitude(); String loc = "Latitude - " + latitude + " Longitude - " + longitude; Toast.makeText(Selection.this, loc, Toast.LENGTH_LONG).show(); } @OverrIDe public voID onCancelled(DatabaseError databaseError) { } });
任何帮助是极大的赞赏.
解决方法:
当Firebase Realtime Database SDK反序列化来自数据库的对象时,它要求所有使用中的对象都具有可用于实例化该对象的公共无参数构造函数.通过使用setter方法或直接访问公共成员来设置对象中的字段.
AndroID的Location对象没有公共的无参数构造函数,因此SDK并不真正知道如何创建其实例.实际上,大多数序列化库将具有相同的要求.因此,不要使用AndroID的Location对象,而要使用自己的对象,并根据需要将数据复制进出.
总结以上是内存溢出为你收集整理的android.location.Location类未定义无参数构造函数全部内容,希望文章能够帮你解决android.location.Location类未定义无参数构造函数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)