Firebase数据库无法检索数据W / ClassMapper:在类

时间:2017-03-02 20:44:12

标签: android firebase firebase-realtime-database

数据库

"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) {

            }


        });




    }

class 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的setter / field   *** ****。m_Model.useri1

2 个答案:

答案 0 :(得分:0)

您正在检索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; }
}

答案 1 :(得分:0)

您应该使用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) {
            // ...
        }
    });