【问题标题】:How can I get the push id for a firebase database element so as to display it in the listView如何获取 firebase 数据库元素的推送 ID 以便在 listView 中显示它
【发布时间】:2018-09-27 14:52:35
【问题描述】:

我正在制作一个待办事项应用程序,实际上是我的第一个 Firebase 应用程序。我已经成功地在 firebase UID 下使用单个文本视图(todo)实现了所有内容,方法是创建一个推送 ID 数组,该数组在列表视图中单击元素时返回推送 ID。

这是我之前的数据结构:

Old data Structure

我遇到的问题是如何获取元素的推送 ID,以便我可以访问它们并将它们显示在我的 ListView 中。

这是我要获取的结构: New data structure

这是我用于在 old 中添加和删除数据的代码 结构

public void Upload(View v) {
    String userId = myRootRef.push().getKey();
    firebaseUniqueID =mAuth.getCurrentUser().getUid();
    todoToUpload=todoEditText.getText().toString();
    myRootRef.child(firebaseUniqueID).child(userId).setValue(todoToUpload);
    startActivity(new Intent(AddTodo.this,showTodo.class));

这是我用于添加和删除的代码:

FirebaseAuth mAuth;
FirebaseDatabase mDataBase= FirebaseDatabase.getInstance();
DatabaseReference myRootRef=mDataBase.getReference();
DatabaseReference userRef;
ListView listView;int pos;
private ArrayAdapter<String> adapter;
ArrayList<String> mTodo=new ArrayList<>();
ArrayList<String> keysList = new ArrayList<>();

adapter=new ArrayAdapter<String>(this,R.layout.custom_list_layout,R.id.tood,mTodo);
        listView.setAdapter(adapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            pos=position;

            AlertDialog.Builder mBuilder=new AlertDialog.Builder(showTodo.this);
            View mView=getLayoutInflater().inflate(R.layout.custom_dialog_show,null);
            Todo=mView.findViewById(R.id.todo);
            Delete=mView.findViewById(R.id.delete);
            Done=mView.findViewById(R.id.done);
            closer=mView.findViewById(R.id.dialog_close);
            mBuilder.setView(mView);
            final AlertDialog dailog=mBuilder.create();
            myRootRef.child(firebaseUniqueID).child(keysList.get(position)).addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    todoOpened=dataSnapshot.getValue(String.class);
                   Todo.setText(todoOpened);

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

            Delete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(Done.isChecked())
                    {
                        mTodo.remove(pos);
                        adapter.notifyDataSetChanged();
                        //new code below
                        myRootRef.getRoot().child(firebaseUniqueID).child(keysList.get(pos)).removeValue();
                        keysList.remove(pos);
                        dailog.dismiss();


                    }
                }
            });



 myRootRef.child(firebaseUniqueID)
            .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot firebaseUniqueID : dataSnapshot.getChildren()) {
                        keysList.add(firebaseUniqueID.getKey());
                    }
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
                    /*handle errors*/
                }
            });



    userRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            String value= dataSnapshot.getValue(String.class);
            mTodo.add(value);
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

这是新旧结构的 JSON 文件

{
  "Z2H2ZkX56fYv3WKxE3a3nCaa8Q63" : {
    "-LNPyZIkX8-uDDGeX-pN" : {
      "Time" : "22:56",
      "Todo" : "play"
    },
    "-LNPze7ppG1L0qFukZO-" : {
      "Priority" : "High",
      "Time" : "22:56",
      "TimeSet" : "09:56",
      "Todo" : "play till the sun goes down"
    },
    "-LNPzhBDDtHv_XSIERX_" : {
      "Priority" : "High",
      "Time" : "22:56",
      "TimeSet" : "09:56",
      "Todo" : "play till the sun goes ddawdawdawdwown"
    }
  }
}

{
  "Z2H2ZkX56fYv3WKxE3a3nCaa8Q63" : {
    "-LNQRCZSsYVPqn0tWghZ" : "play in the evening",
    "-LNQRrLliVSxWBHcEIrv" : "I want to shine like a sun"
  }
}

【问题讨论】:

    标签: android database firebase firebase-realtime-database


    【解决方案1】:

    您可以通过调用getKey() 方法获得DataSnapshot 的密钥。比如:

    public void onDataChange(DataSnapshot dataSnapshot) {
       todoOpened=dataSnapshot.getValue(String.class);
       String key = dataSnapshot.getKey();
       Todo.setText(key + ": "+ todoOpened);
    }
    

    【讨论】:

    • 先生,我明白你的意思,但我的主要问题在于指出数据快照的数据库路径,例如:mDatabase.child(firebaseUniqueId)...但是现在我应该写什么?
    • 有什么办法可以让我侥幸逃脱吗?
    【解决方案2】:

    您可以根据您的新结构显示列表:https://i.stack.imgur.com/E4DXI.png

        FirebaseRecyclerOptions<Messages> options =
                new FirebaseRecyclerOptions.Builder<"Your Class Name">()
                        .setQuery(mMessageThread.child("messages").limitToLast(500), "Your Class Name".class)
                        .setLifecycleOwner(this)
                        .build();
    

    将此与 firebase 适配器一起使用。

    然后获取 ToDo 文本并显示它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-26
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      • 1970-01-01
      相关资源
      最近更新 更多