java - map.containsKey(key) 返回 true,但 map.get(key) 不返回任何内容

标签 java android firebase firebase-realtime-database

我正在努力使用 Firebase 构建一个简单的消息传递系统。但这件事让我想拔掉自己的头发。我有一张 map ,用于存储 <String,Message>对,其中 Message是我写的一个类。但我无法从 map 上获取消息。我已将问题隔离为 map.get(key)不返回消息,即使 map.containsKey(key)返回true 。可能是什么原因造成的以及如何修复它?

这是消息类:

public class Message {
    private long timeStamp;
    private String message;
    private String to;
    private String from;

    public Message(String message, String to, String from)
    {
        timeStamp = new Date().getTime();
        this.message = message;
        this.to = to;
        this.from = from;
    }

    public Message(){

    }

    public String getMessageText() {
        return this.message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getTo() {
        return this.to; 
    }

    public void setTo(String to) {
        this.to = to;
    }

    public String getFrom() {
        return this.from;
    }

    public void setFrom(String from) {
        this.from = from;
    }

    public long getTimeStamp() {
        return this.timeStamp;
    }

    public void setTimeStamp(long timeStamp) { 
        this.timeStamp = timeStamp; 
    }
}

这是我使用的代码,显示了 map.containsKey(key)返回true :

public class LoadMessages extends AppCompatActivity {

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

    // Load previous messages

    final LinearLayout messagesLayout = (LinearLayout) findViewById(R.id.messagesLayout);

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference databaseReference = database.getReference(getIntent().getStringExtra("user") + "/Messages");
    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(final DataSnapshot dataSnapshot) {

            Map<String, Message> map = new TreeMap<String, Message>();

            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                Message m = snapshot.getValue(Message.class);
                map.put(String.valueOf(m.getTimeStamp()), m);

                TextView TV = new TextView(LoadMessages.this);
                Boolean ck = map.containsKey(String.valueOf(m.getTimeStamp()));
                if (ck) {
                    TV.setText("Contains key");
                } else {
                    TV.setText("Doesn't contain key.");
                }
                messagesLayout.addView(TV);
            }

            // code to iterate through map entries and display messages

        }
        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    // code Add new message onClick of fab

}
}

这个版本的代码在 TextView 中没有显示任何内容。 :

public class LoadMessages extends AppCompatActivity {

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

    // Load previous messages

    final LinearLayout messagesLayout = (LinearLayout) findViewById(R.id.messagesLayout);

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference databaseReference = database.getReference(getIntent().getStringExtra("user") + "/Messages");
    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(final DataSnapshot dataSnapshot) {

            Map<String, Message> map = new TreeMap<String, Message>();

            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                Message m = snapshot.getValue(Message.class);
                map.put(String.valueOf(m.getTimeStamp()), m);

                TextView TV = new TextView(LoadMessages.this);
                Message test = map.get(String.valueOf(m.getTimeStamp()));
                TV.setText(test.getMessageText());
                messagesLayout.addView(TV);
            }

            // code to iterate through map entries and display messages

        }
        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    // code Add new message onClick of fab

}
}

编辑:这是我的数据库结构: enter image description here

最佳答案

我认为问题是 snapshot.getValue(Message.class) 返回 null。 TreeMap 可以将 null 存储为值,因此虽然它包含您的键,但值实际上是 null。

关于java - map.containsKey(key) 返回 true,但 map.get(key) 不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44771281/

相关文章:

java - 这个链表有什么问题?

java - 如何渲染路径中有符号链接(symbolic link)的 freemarker 模板?

firebase - 如何在 firebase firestore - flutter 中收集后更新数据

android - 在 Firebase UI 中设置 Logo 大小

java - 如何一次性将从 Firebase 检索到的数据存储在 ArrayList<String> 中?

java - 如何设置冗余 MongoDB 模板?

java - 如何拦截和修改任何更改 JavaFX 场景中标题的尝试?

java - ProgressDialog 未启动 - Android (java)

Android Assets 太慢

android - 在应用程序更新之间更改 Parcelable 结构