2017-06-27 21 views
1

Firebaseを使用している単純なメッセージングシステムの取得に取り組んでいます。しかし、この1つのことが、私自身の髪を引き出したいと思っています。私は<String,Message>のペアを格納するために使用しているマップを持っています。ここでMessageは私が書いたクラスです。私はマップから私のメッセージを得ることはできません。私は、map.containsKey(key)trueを返しても、map.get(key)がメッセージを返さないように問題を切り分けました。これを引き起こしている可能性があり、どうすれば修正できますか?ここでmap.containsKey(key)はtrueを返しますが、map.get(key)は何も返しません。

は、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; 
    } 
} 

これはtrueを返しmap.containsKey(key)を見せてくれた、私が使用するコードです:

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

+0

私はコメントしたいと思いますが、明らかに50人の担当者がいません。簡単な質問ですが、なぜString.valueOf(m.getTimeStamp())を使用していますか? m.getTimeStamp()+ "" –

+0

データベース構造を追加してください。 –

答えて

0

さて、私はそれを理解しました! MessageのStringメッセージはデータベースのmessageTextに変更されていたので、Messageオブジェクトにメッセージを抽出しようとすると認識できませんでした。解決策は、Messageクラスのmessage StringをmessageTextに変更することでした。

0

私は問題はsnapshot.getValue(Message.class)がnullを返すということです。 TreeMapはnullを値として格納できるため、キーが入っている間は値は実際にはnullです。

+0

m(これはsnapshot.getValue(Message.class)でインスタンス化されています)から正しいタイムスタンプを取得することができたので、これは当てはまりません。まだこれを理解することはできません... –

+0

新しい値を地図に挿入してその時点で地図に含まれているものが表示された直後に崩壊しようとしましたか? – mrsegev

関連する問題