【问题标题】:How can i fix this error retrieving data from firebase如何解决从 firebase 检索数据时出现的错误
【发布时间】:2022-01-21 04:21:41
【问题描述】:

这是我存储在数据库中的数据图像。

My Database img

'E/AndroidRuntime: FATAL EXCEPTION: main

Process: com.example.pahalunitedfoundation, PID: 31028
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.pahalunitedfoundation.mainModel
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:436)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80)
    at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203)
    at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:29)
    at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:15)
    at com.firebase.ui.common.BaseCachingSnapshotParser.parseSnapshot(BaseCachingSnapshotParser.java:36)
    at com.firebase.ui.common.BaseObservableSnapshotArray.get(BaseObservableSnapshotArray.java:52)
    at com.firebase.ui.database.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:108)
    at com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:148)
    at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7254)
    at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7337)
    at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6194)
    at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6460)
    at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6300)
    at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6296)
    at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2330)
    at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1631)
    at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1591)
    at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:668)
    at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4309)
    at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:4012)
    at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4578)
    at android.view.View.layout(View.java:23059)
    at android.view.ViewGroup.layout(ViewGroup.java:6479)
    at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1873)
    at android.view.View.layout(View.java:23059)
    at android.view.ViewGroup.layout(ViewGroup.java:6479)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
    at android.view.View.layout(View.java:23059)
    at android.view.ViewGroup.layout(ViewGroup.java:6479)
    at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:536)
    at android.view.View.layout(View.java:23059)
    at android.view.ViewGroup.layout(ViewGroup.java:6479)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
    at android.view.View.layout(View.java:23059)
    at android.view.ViewGroup.layout(ViewGroup.java:6479)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
    at android.view.View.layout(View.java:23059)
    at android.view.ViewGroup.layout(ViewGroup.java:6479)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
    at com.android.internal.policy.DecorView.onLayout(DecorView.java:804)
    at android.view.View.layout(View.java:23059)
    at android.view.ViewGroup.layout(ViewGroup.java:6479)
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3622)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3082)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2075)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8512)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1076)
    at android.view.Choreographer.doCallbacks(Choreographer.java:897)
    at android.view.Choreographer.doFrame(Choreographer.java:826)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1061)
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:236)
    at android.app.ActivityThread.main(ActivityThread.java:8056)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)

下面是写在下面我的 main.java 文件中的代码,我已经删除了这个问题中的导入,因为它显示错误

package com.example.pahalunitedfoundation;

public class Events extends AppCompatActivity {

  eventAdapter eventAdapter;
  RecyclerView recyclerView;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_events);

    recyclerView = findViewById(R.id.rv);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));


    FirebaseRecyclerOptions<mainModel> options =
            new FirebaseRecyclerOptions.Builder<mainModel>()
                    .setQuery(FirebaseDatabase.getInstance().getReference().child("data"), mainModel.class)
                    .build();


    eventAdapter = new eventAdapter(options);
    recyclerView.setAdapter(eventAdapter);
  }

  @Override
  protected void onStart() {
    super.onStart();
    eventAdapter.startListening();
  }

  @Override
  protected void onStop() {
    super.onStop();
    eventAdapter.startListening();
  }
}

下面是我的适配器类的代码(减去导入)

package com.example.pahalunitedfoundation;


public class eventAdapter extends FirebaseRecyclerAdapter <mainModel,eventAdapter.myViewHolder> {

  /**
   * Initialize a {@link RecyclerView.Adapter} that listens to a Firebase query. See
   * {@link FirebaseRecyclerOptions} for configuration options.
   *
   * @param options
   */
  public eventAdapter(@NonNull FirebaseRecyclerOptions<mainModel> options) {
      super(options);
  }

  @Override
  protected void onBindViewHolder(@NonNull myViewHolder holder, int position, @NonNull mainModel model) {
    holder.ename.setText(model.getEname());
    holder.date.setText(model.getDate());
    holder.description.setText(model.getDescription());
    Glide.with(holder.img.getContext())
      .load(model.getSurl())
      .placeholder(R.drawable.common_google_signin_btn_icon_dark)
      .circleCrop()
      .error(R.drawable.common_google_signin_btn_icon_dark)
      .into(holder.img);
  }

  @NonNull
  @Override
  public myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.event_item,parent,false);
    return new myViewHolder(view);
  }

  class myViewHolder extends RecyclerView.ViewHolder{
    // enter code here
    CircleImageView img;
    TextView ename,date,description;


    public myViewHolder(@NonNull View itemView) {
        super(itemView);
        img = (CircleImageView)itemView.findViewById(R.id.img1);
        ename = itemView.findViewById(R.id.enametext);
        date = itemView.findViewById(R.id.Date);
        description = itemView.findViewById(R.id.description);
    }
  }
}

【问题讨论】:

  • 请编辑您的问题并将您的数据库结构添加为 JSON 文件。您可以通过单击 Firebase Console 的溢出菜单 (⠇) 中的导出 JSON 来简单地获取它。还请添加您的mainModel 课程的内容。
  • 我已经给出了我的firebase数据库图像的链接,请看一下!

标签: java android firebase firebase-realtime-database google-cloud-platform


【解决方案1】:

几个问题: 监听器可能应该在 onStop 期间停止

@Override
protected void onStop() {
  super.onStop();
  eventAdapter.stopListening(); // was startListening
}

此外,堆栈跟踪似乎与mainModel 类没有任何真正的适配器代码直接相关。如果你可以包括这个类,它可能会有所帮助。现在 recyclerview 已经设置好了,只需尝试通过传递 data 中的任何内容来实例化 mainModel 我假设它是一个字符串。

FirebaseRecyclerOptions<mainModel> options =
        new FirebaseRecyclerOptions.Builder<mainModel>()
                .setQuery(FirebaseDatabase.getInstance().getReference().child("data"), mainModel.class)
                .build();

如果mainModel 的构造函数不采用String,则需要制作适配器或mainModel 需要更新以采用String

【讨论】:

    【解决方案2】:

    错误表明您在 firebase 数据库的 data 节点中有字符串数据。所以这行代码无法将该字符串转换为mainModel类型。

    FirebaseRecyclerOptions<mainModel> options =
                new FirebaseRecyclerOptions.Builder<mainModel>()
                        .setQuery(FirebaseDatabase.getInstance().getReference().child("data"), mainModel.class)
                        .build();
    

    因此,请在 firebase 控制台上查找数据库,如果 data 节点内有任何字符串,请删除字符串。

    最佳实践,

    总是给你的班级起一个大写的名字。

    例如,

    这样命名,

    public class MainModel
    

    取而代之的是,

    public class mainModel
    

    【讨论】:

      【解决方案3】:

      当您传递以下参考时:

      FirebaseDatabase.getInstance().getReference().child("data")
      

      与 FirebaseRecyclerOptions.Builder 的“setQuety()”方法的“mainModel”类一起,这意味着您要使用 Firebase-UI 库来显示其中存在的所有“mainModel”对象:

      root -> data
      

      这实际上是不可能的,因为在那个引用下它只存在一个字符串类型的孩子,因此出现以下错误:

      com.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的对象转换为 com.example.pahalunitedfoundation.mainModel 类型

      要解决这个问题,您需要在“数据”节点下添加一个额外的级别。这可以使用 DatabaseReference 的push() 方法简单地完成。所以当你在上面的引用中添加一个对象时,像这样添加它:

      DatabaseReference db = FirebaseDatabase.getInstance().getReference();
      DatabaseReference dataRef = db.child("data");
      dataRef.push().setValue(mainModelObject);
      

      这样,您的数据库架构应如下所示:

      Firebase-root
        |
        --- data
             |
             --- $pushedId
                   |
                   --- date: "dd/mm/yyyy"
                   |
                   --- description: "this is a des"
                   |
                   --- name: "Pahal..."
                   |
                   --- surl: "https://..."
      

      获取数据的代码可能保持不变。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-25
        • 2018-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多