为什么在使用dataSnapshot时无法从Firebase获取一些数据

时间:2019-01-02 04:55:30

标签: java android firebase firebase-realtime-database


我很难从Android的Firebase获取数据。
请查看我的代码。

        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
            Logger.log("onChildAdded:" + previousChildName);
            //  Logger.log( dataSnapshot.child("topicid").getValue(String.class));

            //dataSnapshot.child("topicid").getValue();
            mComment = new ArticleComment();
            mComment = dataSnapshot.getValue(ArticleComment.class);


        }

这是ArticleComment类

public class ArticleComment {
    private Date mCommentTime;
    private String mComment;
    private String mUID;
    private String mName;
    private int mColorRed;
    private int mColorGreen;
    private int mColorBlue;


    public ArticleComment(){

    }
    public ArticleComment(Date time, String comment,String name,String uid,int[] color){
        this.mCommentTime = time;
        this.mComment = comment;
        this.mName = name;
        this.mUID = uid;
        this.mColorRed=color[0];
        this.mColorGreen=color[1];
        this.mColorBlue=color[2];

    }
    public Date getTime(){
        return mCommentTime;
    }
    public void setTime(Date time){
        mCommentTime =time;
    }
    public String getComment(){
        return mComment;
    }
    public void setComment(String comment){
        mComment =comment;
    }

    public String getName(){

        return mName;
    }
    public void setName(String name){
        mName=name;
    }
    public String getUID(){
        return mUID;
    }
    public void setUID(String uid){
        mUID=uid;
    }
    public int getColorRed(){
        return mColorRed;
    }
    public int getColorGreen(){
        return mColorGreen;
    }
    public int getColorBlue(){
        return mColorBlue;
    }
    public void setColor(int red,int green, int blue)
    {
        mColorRed=red;
        mColorGreen=green;
        mColorBlue=blue;
    }

        @Exclude
        public Map<String, Object> toMap(){
            HashMap<String, Object> hashmap = new HashMap<>();
            hashmap.put("time", mCommentTime);
            hashmap.put("UID", mUID);
            hashmap.put("name", mName);
            hashmap.put("comment", mComment);
            hashmap.put("colorRed", mColorRed);
            hashmap.put("colorBlue", mColorBlue);
            hashmap.put("colorGreen", mColorGreen);
            return hashmap;
        }

}

这是我的数据库信息。 enter image description here

我只能得到

mCommentTime;
mComment;
mName;

但是我不知道

mUID;
mColorRed;
mColorGreen;
mColorBlue;
我的代码有问题吗?
实际上datasnapshot有数据,但是没有复制到mComment enter image description here


嗨!谢谢朋友,给我的反馈是所有代码。

public class CommentsActivity extends AppCompatActivity {
private DatabaseReference myRef;
private DatabaseReference mTopicRef;
private RecyclerView mRecyclerView;
private RecyclerArticleAdapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
private List<ArticleComment> myDataset = new ArrayList<ArticleComment>();
private ArticleComment mComment;
private Topic mTopic;
private  EditText mTitleEditText;
private  String mUserName;
private  String mUid;
private int mRedColor=100;
private int mBlueColor=100;
private int mGreenolor=100;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_comments);
    //Add action button

    Intent intent =getIntent();
    String id = intent.getStringExtra("ID");
    String date = intent.getStringExtra("Date");
    String title = intent.getStringExtra("Title");
    String topic = intent.getStringExtra("Topic");
     mUserName = intent.getStringExtra("UserName");
     mUid = intent.getStringExtra("UID");

    SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);
    mRedColor= pref.getInt("ColorRed",255);
    mGreenolor=pref.getInt("ColorGreen",255);
    mBlueColor=pref.getInt("ColorBlue",255);
    mRecyclerView = findViewById(R.id.recyclerView_article);
    mRecyclerView.setHasFixedSize(true);

    mLayoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(mLayoutManager);
    //Reference DB
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    myRef = database.getReference("Main").child("Comments").child(id);
    mTopicRef = database.getReference("Main").child("Topics").child(id);

    List<String> topicinfo=new ArrayList<String >();
    topicinfo.add(date);
    topicinfo.add(title);
    topicinfo.add(topic);
    // Set TestAdapter as the adapter for RecyclerView.
    mRecyclerView.setAdapter(mAdapter);
    mAdapter = new RecyclerArticleAdapter(myDataset,topicinfo){
     /*   @Override
        protected void onCheckedChangedRecycle(CompoundButton comButton, final boolean isChecked){
            mTopicRef.runTransaction(new Transaction.Handler() {
                @Override
                public Transaction.Result doTransaction(MutableData mutableData) {
                    Topic t = mutableData.getValue(Topic.class);
                    String id = mutableData.child("topicid").getValue(String.class);
                    t.setTopicID(id);
                    if (t == null) {
                        return Transaction.success(mutableData);
                    }

                    if (isChecked==true) {
                        // Unstar the post and remove self from stars
                        t.setRate(t.getRate()+1);
                    } else {
                        // Star the post and add self to stars
                        t.setRate(t.getRate()-1);
                    }

                    // Set value and report transaction success
                    mutableData.setValue(t);
                    return Transaction.success(mutableData);
                }

                @Override
                public void onComplete(DatabaseError databaseError, boolean b,
                                       DataSnapshot dataSnapshot) {
                    // Transaction completed

                }
            });
        } */
    };

    mRecyclerView.setAdapter(mAdapter);

    findViewById(R.id.button2).setOnClickListener(button1ClickListener);
    mTitleEditText = findViewById(R.id.editText2);
    ChildEventListener childEventListener = new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {

            mComment = new ArticleComment();
            mComment = dataSnapshot.getValue(ArticleComment.class);

            Logger.log("onChildAdded:addItem" + previousChildName);

            mAdapter.addItem(mAdapter.getItemCount()-1, mComment);
            Logger.log("onChildAdded:scrollToPosition" + previousChildName);
            mAdapter.updateItem(mAdapter.getItemCount()-1,mComment);
            mLayoutManager.scrollToPosition(mAdapter.getItemCount()-1);

        }

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


        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {


        }

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


        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    };
    myRef.addChildEventListener(childEventListener);
}
View.OnClickListener button1ClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      //  finish();
        Logger.log("onClick");
        if(mTitleEditText.getText().toString().equals("")){
            return;
        }
        //setting color
        int color[]=new int[3];
        color[0]= mRedColor;
        color[1]=mGreenolor;
        color[2]=mBlueColor;
        mComment = new ArticleComment(new Date(),mTitleEditText.getText().toString(),mUserName,mUid,color);
        sendTopic(mComment,myRef);
        //Delete all text
        mTitleEditText.setText("");
    }
};

// Sending topic to DB
public void sendTopic(ArticleComment test,DatabaseReference ref) {
    String key = ref.push().getKey();
    Map<String, Object> map = new HashMap<>();
    map.put(key, test.toMap());
    ref.updateChildren(map);
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        finish();
        return true;
    }
    return true;
}

信息是否足够?

2 个答案:

答案 0 :(得分:0)

Firebase遵循JavaBean命名约定,以从Java代码确定JSON属性的名称。按照约定,getUIDsetUID映射到具有小写字母uID的属性u

要使Firebase客户端采用您的命名约定,请用@PropertyName注释getter和setter:

@PropertyName("UID")
public String getUID(){
    return mUID;
}
@PropertyName("UID")
public void setUID(String uid){
    mUID=uid;
}

我不确定其他属性为什么不起作用。发生这种情况时,我发现编写 Firebase类型的对象以查看其生成的内容最有用。

答案 1 :(得分:0)

**

  

如果要将值存储在模型中,则变量名应为   与Firebase节点相同,否则您需要输入“转换”。

**

    private Date mCommentTime;
    private String mComment;
    private String mUID;
    private String mName;
    private int mColorRed;
    private int mColorGreen;
    private int mColorBlue;

在上方替换为

private int time;
private String comment;
private String UID;
private String name;
private int colorRed;
private int colorBlue;
private int colorGreen;

现在使用上述节点创建获取器,设置器,构造器等。 (现在,您将能够获取所有值)。

希望它能为您提供帮助:)