簡體   English   中英

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

[英]map.containsKey(key) returns true, but map.get(key) doesn't return anything

我正在努力使用Firebase來使用簡單的消息傳遞系統。 但這一件事讓我想要拔出自己的頭發。 我有一個地圖,我用來存儲<String,Message>對,其中Message是我寫的一個類。 我不能把我的信息從地圖上拿出來。 即使map.containsKey(key)返回true ,我也已將問題與map.get(key)隔離,而不返回Message。 可能導致這種情況的原因以及如何解決?

這是Message類:

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

}
}

編輯:這是我的數據庫結構: 在此輸入圖像描述

我認為問題是snapshot.getValue(Message.class)返回null。 TreeMap可以將null存儲為值,因此當它包含您的鍵時,該值實際上為null。

好的,我明白了! 事實證明,消息中的消息字符串被更改為數據庫中的messageText,因此當我嘗試將其提取到Message對象時,它將無法識別它。 解決方法是將Message類中的消息String更改為messageText。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM