使用FirebaseRecyclerAdapter填充Firebase数据库异常时获取Firebase数据库异常(Getting Firebase Database exception while u

编程入门 行业动态 更新时间:2024-10-24 23:15:49
使用FirebaseRecyclerAdapter填充Firebase数据库异常时获取Firebase数据库异常(Getting Firebase Database exception while using FirebaseRecyclerAdapter to populate the)

我在使用FirebaseRecyclerAdapter时遇到了一个问题。

Firebase实时数据库结构如下:

我在这里要做的是,从Firebase实时数据库的“MainGroup”部分中获取数据中的关键字

为此,我创建了一个名为RecyclerDataGetSetCLass的模型类和一个名为RecyclerDataGetSetClassViewHolder视图持有者类

但我得到一个错误说

com.google.firebase.database.DatabaseException:无法将类型为java.lang.String的对象转换为类型com.example.talarir.mapproject.NonAdminClasses.RecyclerDataGetSetCLass

Activity类和其他java文件如下所示:

1) NonAdminACtivity.java //which contains the viewholder class

public class NonAdminACtivity extends AppCompatActivity implements View.OnClickListener { private FirebaseAuth mAuth; private FirebaseAuth.AuthStateListener mAuthListener; public Button saveLocationBtn,getLocationBtn; public RecyclerView nonAdminRecyclerView; private Boolean flag=false; private DatabaseReference mFirebaseDatabase; private FirebaseDatabase mFirebaseInstance; private DatabaseReference mFirebaseDatabase1; private FirebaseDatabase mFirebaseInstance1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_non_admin_activity); mFirebaseInstance1 = FirebaseDatabase.getInstance(); mFirebaseDatabase1 = mFirebaseInstance1.getReference("MainGroup"); nonAdminRecyclerView= (RecyclerView) findViewById(R.id.recycler_view_fragment_one); nonAdminRecyclerView.setHasFixedSize(true); nonAdminRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mAuth = FirebaseAuth.getInstance(); mAuthListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { FirebaseUser user = firebaseAuth.getCurrentUser(); if (user != null) { // User is signed in flag=true; Log.d("CooActivity", "onAuthStateChanged:signed_in:" + user.getUid()); Toast.makeText(getApplicationContext(),"done",Toast.LENGTH_SHORT).show(); } else { // User is signed out Log.d("CooActivity", "onAuthStateChanged:signed_out"); startActivity(new Intent(getApplicationContext(), LoginActivity.class)); finish(); } } }; } @Override public void onStart() { super.onStart(); mAuth.addAuthStateListener(mAuthListener); saveLocationBtn= (Button) findViewById(R.id.saveLocationOfUser); saveLocationBtn.setOnClickListener(this); getLocationBtn= (Button) findViewById(R.id.getLocationOfUser); getLocationBtn.setOnClickListener(this); FirebaseRecyclerAdapter<RecyclerDataGetSetCLass,RecyclerDataGetSetClassViewHolder> firebaseRecyclerAdapter=new FirebaseRecyclerAdapter<RecyclerDataGetSetCLass, RecyclerDataGetSetClassViewHolder>( RecyclerDataGetSetCLass.class, R.layout.each_list_non_admin, RecyclerDataGetSetClassViewHolder.class, mFirebaseDatabase1 ) { @Override protected void populateViewHolder(RecyclerDataGetSetClassViewHolder viewHolder, RecyclerDataGetSetCLass model, int position) { viewHolder.setMainGroupName(model.getMainGroupName()); } }; nonAdminRecyclerView.setAdapter(firebaseRecyclerAdapter); } public static class RecyclerDataGetSetClassViewHolder extends RecyclerView.ViewHolder { View mView; public RecyclerDataGetSetClassViewHolder(View itemView) { super(itemView); mView=itemView; } public void setMainGroupName(String mainGroupName) { TextView textView= (TextView) mView.findViewById(R.id.textViewRecyclerViewNonAdmin); textView.setText(mainGroupName); } } @Override public void onStop() { super.onStop(); if (mAuthListener != null) { mAuth.removeAuthStateListener(mAuthListener); } } @Override protected void onDestroy() { FirebaseAuth.getInstance().signOut(); super.onDestroy(); } @Override public void onClick(View v) { if (v.getId()==R.id.saveLocationOfUser) { if (flag) { saveUserLocation_NonAdminActivity(); } else { Toast.makeText(this,"firebase not ready",Toast.LENGTH_SHORT).show(); } } if (v.getId()==R.id.getLocationOfUser) { retrieveUserLocation_NonAdminActivity(); } } private void retrieveUserLocation_NonAdminActivity() { CreationOfUserClass creationOfUserClass=new CreationOfUserClass(this); creationOfUserClass.retrieveUserDataFromFireBase(mFirebaseDatabase,mFirebaseInstance); } private void saveUserLocation_NonAdminActivity() { FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser(); final CreationOfUserClass creationOfUserClass=new CreationOfUserClass(this); creationOfUserClass.createUsers(user, mFirebaseDatabase,mFirebaseInstance); } }

2) RecyclerDataGetSetCLass //The model class

public class RecyclerDataGetSetCLass { private String mainGroupName; public RecyclerDataGetSetCLass() { } public RecyclerDataGetSetCLass(String mainGroupName) { this.mainGroupName=mainGroupName; } public String getMainGroupName() { return mainGroupName; } public void setMainGroupName(String mainGroupName) { this.mainGroupName = mainGroupName; } }

3) activity_non_admin_activity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_non_admin_activity" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.talarir.mapproject.NonAdminACtivity"> <Button android:text="SaveLocation" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/saveLocationOfUser" /> <Button android:text="getLocation" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/getLocationOfUser" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view_fragment_one" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </LinearLayout> </LinearLayout>

4) each_list_non_admin.xml //the layout to be inflated for each recycler list element

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="60dp" xmlns:card_view="http://schemas.android.com/tools"> <android.support.v7.widget.CardView android:id="@+id/card_view" android:layout_gravity="center" android:layout_width="fill_parent" android:layout_height="100dp" android:layout_margin="5dp" card_view:cardCornerRadius="2dp" card_view:contentPadding="10dp"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/textViewRecyclerViewNonAdmin"/> </android.support.v7.widget.CardView> </RelativeLayout>

错误日志如下所示:

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.talarir.mapproject.NonAdminClasses.RecyclerDataGetSetCLass at com.google.android.gms.internal.zzbtg.zze(Unknown Source) at com.google.android.gms.internal.zzbtg.zzb(Unknown Source) at com.google.android.gms.internal.zzbtg.zza(Unknown Source) at com.google.firebase.database.DataSnapshot.getValue(Unknown Source) at com.firebase.ui.database.FirebaseRecyclerAdapter.parseSnapshot(FirebaseRecyclerAdapter.java:151) at com.firebase.ui.database.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:140) at com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:183) at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6308) at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6341) at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5287) at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5550) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5392) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5388) at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2149) at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1533) at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1496) at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:593) at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3535) at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3264) at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1633) at android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:341) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871) at android.view.Choreographer.doCallbacks(Choreographer.java:683) at android.view.Choreographer.doFrame(Choreographer.java:616) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6209) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) D/AppTracker: App Event: crash I/Process: Sending signal. PID: 29821 SIG: 9 Application terminated.

请帮助我解决这个问题。

I am facing an issue in using the FirebaseRecyclerAdapter.

The firebase realtime database structure is as follows:

What I'm trying to do here is, Get only the key's from data present in the "MainGroup" part of the firebase realtime database.

So to do that, I've created a model class named RecyclerDataGetSetCLass and one viewholder class named RecyclerDataGetSetClassViewHolder

but i am getting an error saying

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.talarir.mapproject.NonAdminClasses.RecyclerDataGetSetCLass

The Activity classes and other java files are as follows:

1) NonAdminACtivity.java //which contains the viewholder class

public class NonAdminACtivity extends AppCompatActivity implements View.OnClickListener { private FirebaseAuth mAuth; private FirebaseAuth.AuthStateListener mAuthListener; public Button saveLocationBtn,getLocationBtn; public RecyclerView nonAdminRecyclerView; private Boolean flag=false; private DatabaseReference mFirebaseDatabase; private FirebaseDatabase mFirebaseInstance; private DatabaseReference mFirebaseDatabase1; private FirebaseDatabase mFirebaseInstance1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_non_admin_activity); mFirebaseInstance1 = FirebaseDatabase.getInstance(); mFirebaseDatabase1 = mFirebaseInstance1.getReference("MainGroup"); nonAdminRecyclerView= (RecyclerView) findViewById(R.id.recycler_view_fragment_one); nonAdminRecyclerView.setHasFixedSize(true); nonAdminRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mAuth = FirebaseAuth.getInstance(); mAuthListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { FirebaseUser user = firebaseAuth.getCurrentUser(); if (user != null) { // User is signed in flag=true; Log.d("CooActivity", "onAuthStateChanged:signed_in:" + user.getUid()); Toast.makeText(getApplicationContext(),"done",Toast.LENGTH_SHORT).show(); } else { // User is signed out Log.d("CooActivity", "onAuthStateChanged:signed_out"); startActivity(new Intent(getApplicationContext(), LoginActivity.class)); finish(); } } }; } @Override public void onStart() { super.onStart(); mAuth.addAuthStateListener(mAuthListener); saveLocationBtn= (Button) findViewById(R.id.saveLocationOfUser); saveLocationBtn.setOnClickListener(this); getLocationBtn= (Button) findViewById(R.id.getLocationOfUser); getLocationBtn.setOnClickListener(this); FirebaseRecyclerAdapter<RecyclerDataGetSetCLass,RecyclerDataGetSetClassViewHolder> firebaseRecyclerAdapter=new FirebaseRecyclerAdapter<RecyclerDataGetSetCLass, RecyclerDataGetSetClassViewHolder>( RecyclerDataGetSetCLass.class, R.layout.each_list_non_admin, RecyclerDataGetSetClassViewHolder.class, mFirebaseDatabase1 ) { @Override protected void populateViewHolder(RecyclerDataGetSetClassViewHolder viewHolder, RecyclerDataGetSetCLass model, int position) { viewHolder.setMainGroupName(model.getMainGroupName()); } }; nonAdminRecyclerView.setAdapter(firebaseRecyclerAdapter); } public static class RecyclerDataGetSetClassViewHolder extends RecyclerView.ViewHolder { View mView; public RecyclerDataGetSetClassViewHolder(View itemView) { super(itemView); mView=itemView; } public void setMainGroupName(String mainGroupName) { TextView textView= (TextView) mView.findViewById(R.id.textViewRecyclerViewNonAdmin); textView.setText(mainGroupName); } } @Override public void onStop() { super.onStop(); if (mAuthListener != null) { mAuth.removeAuthStateListener(mAuthListener); } } @Override protected void onDestroy() { FirebaseAuth.getInstance().signOut(); super.onDestroy(); } @Override public void onClick(View v) { if (v.getId()==R.id.saveLocationOfUser) { if (flag) { saveUserLocation_NonAdminActivity(); } else { Toast.makeText(this,"firebase not ready",Toast.LENGTH_SHORT).show(); } } if (v.getId()==R.id.getLocationOfUser) { retrieveUserLocation_NonAdminActivity(); } } private void retrieveUserLocation_NonAdminActivity() { CreationOfUserClass creationOfUserClass=new CreationOfUserClass(this); creationOfUserClass.retrieveUserDataFromFireBase(mFirebaseDatabase,mFirebaseInstance); } private void saveUserLocation_NonAdminActivity() { FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser(); final CreationOfUserClass creationOfUserClass=new CreationOfUserClass(this); creationOfUserClass.createUsers(user, mFirebaseDatabase,mFirebaseInstance); } }

2) RecyclerDataGetSetCLass //The model class

public class RecyclerDataGetSetCLass { private String mainGroupName; public RecyclerDataGetSetCLass() { } public RecyclerDataGetSetCLass(String mainGroupName) { this.mainGroupName=mainGroupName; } public String getMainGroupName() { return mainGroupName; } public void setMainGroupName(String mainGroupName) { this.mainGroupName = mainGroupName; } }

3) activity_non_admin_activity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_non_admin_activity" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.talarir.mapproject.NonAdminACtivity"> <Button android:text="SaveLocation" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/saveLocationOfUser" /> <Button android:text="getLocation" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/getLocationOfUser" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view_fragment_one" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </LinearLayout> </LinearLayout>

4) each_list_non_admin.xml //the layout to be inflated for each recycler list element

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="60dp" xmlns:card_view="http://schemas.android.com/tools"> <android.support.v7.widget.CardView android:id="@+id/card_view" android:layout_gravity="center" android:layout_width="fill_parent" android:layout_height="100dp" android:layout_margin="5dp" card_view:cardCornerRadius="2dp" card_view:contentPadding="10dp"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/textViewRecyclerViewNonAdmin"/> </android.support.v7.widget.CardView> </RelativeLayout>

The error log is as follows :

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.talarir.mapproject.NonAdminClasses.RecyclerDataGetSetCLass at com.google.android.gms.internal.zzbtg.zze(Unknown Source) at com.google.android.gms.internal.zzbtg.zzb(Unknown Source) at com.google.android.gms.internal.zzbtg.zza(Unknown Source) at com.google.firebase.database.DataSnapshot.getValue(Unknown Source) at com.firebase.ui.database.FirebaseRecyclerAdapter.parseSnapshot(FirebaseRecyclerAdapter.java:151) at com.firebase.ui.database.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:140) at com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:183) at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6308) at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6341) at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5287) at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5550) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5392) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5388) at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2149) at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1533) at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1496) at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:593) at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3535) at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3264) at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1633) at android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:341) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871) at android.view.Choreographer.doCallbacks(Choreographer.java:683) at android.view.Choreographer.doFrame(Choreographer.java:616) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6209) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) D/AppTracker: App Event: crash I/Process: Sending signal. PID: 29821 SIG: 9 Application terminated.

Kindly assist me to get through this issue.

最满意答案

您显示的每个项目的值都是单个字符串( -K.... )。 你试图从价值中读取整个课程,而这根本行不通。

final FirebaseRecyclerAdapter<RecyclerDataGetSetCLass,RecyclerDataGetSetClassViewHolder> firebaseRecyclerAdapter=new FirebaseRecyclerAdapter<RecyclerDataGetSetCLass, RecyclerDataGetSetClassViewHolder>( String.class, R.layout.each_list_non_admin, RecyclerDataGetSetClassViewHolder.class, mFirebaseDatabase1 ) { @Override protected void populateViewHolder(RecyclerDataGetSetClassViewHolder viewHolder, String model, int position) { String key = adapter.getRef(position).getKey(); viewHolder.setMainGroupName(key); } };

在这段代码中,我查看了正在显示的项目的关键字,这可能是您要查找的值。

The value of each item you're displaying is a single string (-K....). You're trying to read an entire class out of the value, and that simply won't work.

final FirebaseRecyclerAdapter<RecyclerDataGetSetCLass,RecyclerDataGetSetClassViewHolder> firebaseRecyclerAdapter=new FirebaseRecyclerAdapter<RecyclerDataGetSetCLass, RecyclerDataGetSetClassViewHolder>( String.class, R.layout.each_list_non_admin, RecyclerDataGetSetClassViewHolder.class, mFirebaseDatabase1 ) { @Override protected void populateViewHolder(RecyclerDataGetSetClassViewHolder viewHolder, String model, int position) { String key = adapter.getRef(position).getKey(); viewHolder.setMainGroupName(key); } };

In this snippet I look up the key of the item being shown, which is likely the value that you're looking for.

更多推荐

本文发布于:2023-08-07 23:43:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1466431.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:异常   数据库   Firebase   FirebaseRecyclerAdapter   exception

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!