【问题标题】:Firebase database not retrieving data W/ClassMapper: No setter/field for -KeAi52QSaiuf7p5jEYM found on classFirebase 数据库未检索 W/ClassMapper 的数据:在类上找不到 -KeAi52QSaiuf7p5jEYM 的设置器/字段
【发布时间】:2017-03-09 09:03:33
【问题描述】:

数据库

"userinformation": [
    "-KeAi52QSaiuf7p5jEYM" : {
        "website" : "test1"
        "username" : "test1"
    }
}

类 myprofile 未检索数据

package **.****;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import android.view.Menu;
import android.view.MenuItem;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import ****.****.m_Model.useri1;



public class myprofile  extends AppCompatActivity {


    private  TextView myusername111;
   private DatabaseReference mFirebaseDatabase;
    private FirebaseDatabase mFirebaseInstance;


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




        myusername111 = (TextView) findViewById(R.id.textview22);
        mFirebaseInstance = FirebaseDatabase.getInstance();

      mFirebaseInstance.getReference("userinformation").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                useri1 model = dataSnapshot.getValue(useri1.class);

             myusername111.setText(model.getusername());


            }
            @Override
            public void onCancelled(DatabaseError databaseError) {

            }


        });




    }

类edit_profile

package package ***.****;

import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import ***.***.m_Model.useri1;




public class edit_profile extends AppCompatActivity {
    private Toolbar toolbar;






    private EditText website;
    private EditText username;
    private Button bsubmit;
    private DatabaseReference mFirebaseDatabase;
    private FirebaseDatabase mFirebaseInstance;


    private android.view.ViewGroup parent;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        setContentView(R.layout.activity_edit_profile);


        mFirebaseInstance = FirebaseDatabase.getInstance();
        mFirebaseDatabase = mFirebaseInstance.getReference("users");
        usernamr = (EditText) findViewById(R.id.usernamr);
        website = (EditText) findViewById(R.id.website);
        Button bsubmit = (Button) findViewById(R.id.b_submit);


                bsubmit.setOnClickListener(new View.OnClickListener() {


                    @Override
                    public void onClick(View v) {

                        if (!isEmpty(website, username) && !isEmpty(website, username)) {
                            mNewprofile("53", website.getText().toString().trim(), username.getText().toString().trim());
                           finish();
                           startActivity(new Intent(getApplicationContext(), myprofile.class));
                        }
                    }


        } );



    }
    private void mNewprofile(String s, String username, String website) {



        new_profile1 userinformation1 = new new_profile1(website, username);

        mFirebaseDatabase.child("userinformation").setValue(userinformation1);
    }

class useri1

package **.****.m_Model;



public class useri1 {


    public String username;
    public String website;


    public Update_user1() {
    }
    public Update_user1(String username,String website) {
        this.website = website;
        this.username = username;


    }

    public String getwebsite() {

        return website;
     }

    public String getusername() {

         return username;
     }
    public void setwebsite(String website) {
          this.website = website;

      }
  public void setusermame(String usermame) {
         this.usermame = usermame;

     }

错误:

W/ClassMapper:在类上找不到 -KeAi52QSaiuf7p5jEYM 的设置器/字段 ***.****.m_Model.useri1

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    您正在检索userinformation 的值。所以你在onDataChange 得到的快照会有这个值:

    "-KeAi52QSaiuf7p5jEYM" : {
        "website" : "test1"
        "username" : "test1"
    }
    

    useri1 具有 websiteusername 属性。但是在上面的 JSON 中,只有一个名为 -KeAi52QSaiuf7p5jEYM 的属性。所以两者不匹配,导致你得到的错误。

    要解决此问题,您应该做一些事情:

    • 循环遍历快照中的孩子
    • 大大简化您的 POJO

    生成的代码将是:

    mFirebaseInstance.getReference("userinformation").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
                MyUser model = dataSnapshot.getValue(MyUser.class);
                myusername111.setText(model.username);
            }
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
            throw databaseError.toException(); // don't ignore errors
        }
    });
    
    public class MyUser {
        public String username;
        public String website;
    }
    

    也可以使用带有 getter 和 setter 的类。但在这种情况下,请确保 getter 遵循 Java Bean 的大写属性规则。所以:

    public class MyUser {
        private String username;
        private String website;
        public MyUser() {
        }
        public String getUsername() { return username; }
        public void setUsername(string value) { username = value; }
        public String getWebsite() { return website; }
        public void setWebsite(string value) { website = value; }
    }
    

    【讨论】:

      【解决方案2】:

      您应该使用ChildEventListener 而不是ValueEventListener

      因为您使用的是ValueEventListener,所以Firebase 试图设置一个名为-KeAi52QSaiuf7p5jEYM 的属性,但它不是属性,而是键。

      添加ChildEventListener的代码如下:

      mFirebaseInstance.getReference("userinformation").addChildEventListener(new ChildEventListener() {
              @Override
              public void onChildAdded(DataSnapshot dataSnapshot, String previousKey) {
                  Update_user1 user = dataSnapshot.getValue(Update_user1.class);
                  // ...
              }
      
              @Override
              public void onChildChanged(DataSnapshot dataSnapshot, String previousKey) {
                  // ...
              }
      
              @Override
              public void onChildMoved(DataSnapshot dataSnapshot, String previousKey) {
                  // ...
              }
      
              @Override
              public void onChildRemoved(DataSnapshot dataSnapshot) {
                  // ...
              }
      
              @Override
              public void onCancelled(DatabaseError databaseError) {
                  // ...
              }
          });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-22
        • 1970-01-01
        • 2020-07-15
        • 1970-01-01
        • 2017-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多