時遇到Firebase數據庫異常我在使用FirebaseRecyclerAdapter
時遇到問題。在使用FirebaseRecyclerAdapter填充
的火力實時數據庫結構如下:
什麼我想在這裏做, 僅獲得了關鍵的中存在的「MainGroup」部分數據的Firebase實時數據庫。
因此,要做到這一點,我創建了一個名爲RecyclerDataGetSetCLass
模型類和一個viewholder類名爲RecyclerDataGetSetClassViewHolder
,但我得到一個錯誤說
是com.google.firebase.database。 DatabaseException:無法轉換對象 java.lang.String類型的輸入 com.example.talarir.mapproject.NonAdminClasses.RecyclerDataGetSetCLass
的活動類和其他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.
請幫助我通過這個問題來獲得。
非常感謝! :) –