【问题标题】:Reading and writing to firebase database using Firebase list adapter使用 Firebase 列表适配器读取和写入 Firebase 数据库
【发布时间】:2019-08-08 14:15:56
【问题描述】:

我正在尝试从 ListView 中的 Firebase 数据库中读取数据。 ListView 中的每个项目都带有一个按钮,一旦单击该按钮,文本视图中的读取数据集就会写入数据库。下面的代码是我用于显示ListView 和写入数据库的代码。This is my database

 if (FirebaseAuth.getInstance().getCurrentUser() ==null{
       Toast.makeText(getApplicationContext(),"logon first", Toast. Length.SHORT).show() ; 
   } else{
    display() ;
    } 

 private void display(){
    Query query=FirebaseDatabase.getInstance().getReference().child("border_details");
    FirebaseListOptions<DRive>options=new FirebaseListOptions.Builder<DRive>().setQuery(query,DRive.class).setLayout(R.layout.messages).build();
    ListView list= findViewById(R.id.list_of_messages);
    adapter=new FirebaseListAdapter<DRive>(options) {
        @Override
        protected void populateView(View v, DRive model, int position) {
            Button d=(Button)findViewById(R.id.button_accept);
            final TextView z=(TextView)findViewById(R.id.dropoff);
            final TextView c=(TextView)findViewById(R.id.pickup);
            final TextView f=(TextView)findViewById(R.id.timed);
            final TextView m=(TextView) findViewById(R.id.points);
            z.setText(model.getDropoffspot());
            c.setText(model.getPickupspot());
            f.setText(model.getPickuptime());
            m.setText(model.getKey());
            d.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    DRive dRive=new DRive();
                    hec();
                    dRive.setDropoffspot(chi);
                    dRive.setKey(pt);
                    dRive.setPickupspot(g);
                    dRive.setPickuptime(boo);
                    dRive.setKey(pt);
                    myRef.child(pt).push().setValue(dRive);
                    Toast.makeText(getApplicationContext(),"shi",Toast.LENGTH_SHORT).show();


                }

                private void hec() {
                    pt=m.getText().toString();
                    boo=f.getText().toString();
                    chi=z.getText().toString();
                    g=c.getText().toString();
                }
            });




        }
    };
    list.setAdapter(adapter);

这是我的 json

{
"order_details" : {
"DEzUoNY6BqOVn1DVIbFwOk6B4dT2" : {
  "-LlkSlkLOZYY7iy5vBWY" : {
    "dropoffspot" : "17 nursery crescent",
    "key" : "DEzUoNY6BqOVn1DVIbFwOk6B4dT2",
    "kutaPoints" : 80,
    "pickupspot" : "Mukuba l",
    "pickuptime" : "teaTime"
  }
}

} }

这是我的驾驶课

public class DRive {
private String Pickuptime;
private String Pickupspot;
private String Dropoffspot;
private String passengers;
private String Key;
public DRive(String passengers, String Pickupspot, String Pickuptime, String Dropoffspot, String Key){
    this.Dropoffspot=Dropoffspot;
    this.Pickupspot=Pickupspot;
    this.passengers=passengers;
    this.Pickuptime=Pickuptime;
    //mestime=new Date().getTime();

}
public DRive(){

}
public String getPickuptime(){
    return Pickuptime;
}

public void setPickuptime(String time) {
    this.Pickuptime = time;
}

public String getDropoffspot() {
    return Dropoffspot;
}

public void setDropoffspot(String dropoffspot) {
    this.Dropoffspot = Dropoffspot;
}

public String getPickupspot() {
    return Pickupspot;
}

public void setPickupspot(String pickupspot) {
    this.Pickupspot = Pickupspot;
}

public String getPassengers() {
    return passengers;
}

public String getKey() {
    return Key;
}

public void setKey(String key) {
    Key = key;
}

应用程序应该从子 order_details 读取数据并使用 FirebaseListAdapter 将其显示在 ListView 中,而不是应用程序。

应用程序应该从数据库中读取并使用FirebaseListAdapter 在列表视图的部分显示检索到的数据,而不是它甚至不显示ListView。请提供帮助。

【问题讨论】:

    标签: java android firebase listview firebase-realtime-database


    【解决方案1】:

    在您的 order_details 节点和实际的 DRive 对象之间有另一个孩子。正如我在您的数据库中看到的,是经过身份验证的用户的uid。为了解决这个问题,你还需要给那个孩子添加一个调用。所以请更改以下代码行:

    Query query=FirebaseDatabase.getInstance().getReference().child("order_details");
    

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    Query query=FirebaseDatabase.getInstance().getReference().child("order_details").child(uid);
    

    编辑:

    没有办法使用您的实际数据库结构来查询数据库并一次性获取所有用户的所有订单。如果你想这样,你应该重新考虑你的数据库结构或简单地复制数据。如果您想获取所有用户的所有订单,请查看以下可能的架构:

    Firebase-root
      |
      --- order_details
            |
            --- orderIdOne
            |     |
            |     --- //orderDetails
            |     |
            |     --- uid: "DEzUoNY6BqOVn1DVIbFwOk6B4dT2"
            |
            --- orderIdTwo
                  |
                  --- //orderDetails
                  |
                  --- uid: "USw0LFY6BqOVn1DVIbFwOkhcvPwf"
    

    要获取所有订单,只需在 order_details 节点上附加一个侦听器,如果您想获取与单个用户对应的所有订单,请使用以下查询:

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference orderDetailsRef = rootRef.child("order_details");
    Query query = orderDetailsRef.orderByChild("uid").equalTo(uid);
    query.addListenerForSingleValueEvent(/* ... */);
    

    编辑2:

    由于DRive 类中的字段与数据库中的字段不匹配,您什么也得不到。要解决这个问题,请查看我在以下帖子中的回答:

    【讨论】:

    • 问题是,这只是一个用户在 json 文件中的写入,一旦其他用户访问应用程序,他们将以与我相同的方式写入数据,我希望所有这些数据可以在列表视图中访问。同一个order_details节点会有不同的用户id
    • 很公平,但您仍需要将调用添加到.child(uid)。试过了吗,有效果吗?
    • 我没有,但它不会只返回当前用户的数据吗?理想情况下,用户应该查看其他用户的数据
    • 所以你应该试试。同时,请查看我的更新答案。
    • 非常感谢,我会在早上的第一件事尝试,我真的很感激,它很有道理,我相信它会起作用
    【解决方案2】:

    我发现了如何解决我的问题。我添加了一个 onstart 和 onstop 监听器,如下所示

      @Override 
       protected void onStart() {
            super.onStart();
            adapter.startListening();
       }
       @Override 
        protected void onStop() {
             super.onStop();
             adapter.stopListening();
       }
      }
    

    例如,我还通过在引入 textview 后添加“v”来调整我的 Textview 代码。 代替 最终的 TextView f=(TextView)findViewById(R.id.timed); 我把它改成 最终的 TextView f=(TextView)v。 findViewById(R.id.timed);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      • 2018-05-19
      相关资源
      最近更新 更多