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

标签 java android firebase firebase-realtime-database


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

        @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

我只能得到

m评论时间;
m评论;
mName;

但我无法得到

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


嗨!谢谢各位 friend ,给我反馈这里都是代码。

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

信息是否足够?

最佳答案

Firebase 遵循 JavaBean 命名约定,从 Java 代码中确定 JSON 属性的名称。在该约定中,getUIDsetUID 映射到具有小写 u 的属性 uID

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

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

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

关于java - 为什么我在使用 dataSnapshot 时无法从 Firebase 获取一些数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54001385/

相关文章:

firebase - 在现有 Firebase 项目目录中初始化 firebase CLI 功能

android - ListView 适配器不能应用于 Modal 类

java - 在 openshift 中连接 mongodb 显示错误。

php - 检测用户平台

java - 为什么 android ImageAdapter 不延迟加载图像?

java - 检测来自另一部手机的输入?

firebase - 方法 'setData' 没有为类型 'documentreference' 定义

Java GNU GetOpt : Understanding LongOpt's StringBuffer flag

jvm - Java程序执行背后的内部过程

java - ConcurrentNavigableMap 与 NavigableMap 的差异