Android с Firebase: DataSnapshot.getValue () выбрасывает java .lang.IllegalArgumentException - PullRequest
1 голос
/ 05 января 2020

Я пишу и читаю класс User из базы данных Firebase в реальном времени. Это класс пользователя:

public class User {

    public String name;
    public int number;
    public String title;
    public String company;
    public String location;
    public Bitmap image;
    public String name_title_company_location;

    public User() {
        // Default constructor required for calls to DataSnapshot.getValue(User.class)
    }

    public User(String name, int number, String title, String company, String location, Bitmap image) {
        this.name = name;
        this.number = number;
        this.title = title;
        this.company = company;
        this.location = location;
        this.image = image;
        this.name_title_company_location = name + "_" + title + "_" +company + "_" + location;
    }

Это моя база данных Firebase в реальном времени:

users
  0
    company: "Indifair"
    image
    location: "Bangalore"
    name: "Anupam Singh"
    name_title_company_location: "Anupam Singh_Engineer_Indifair_Bangalore"
    number: 956156494
    title: "Engineer"

Этот фрагмент кода выдает ошибку:

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
EditText t1 = (EditText) findViewById(R.id.editText10);
EditText t2 = (EditText) findViewById(R.id.editText11);
EditText t3 = (EditText) findViewById(R.id.editText13);
EditText t4 = (EditText) findViewById(R.id.editText14);

String s1 = t1.getText().toString();
String s2 = t2.getText().toString();
String s3 = t3.getText().toString();
String s4 = t4.getText().toString();

mDatabase.child("users").orderByChild("name_title_company_location")
        .equalTo(s1 + "_" + s2 + "_" + s3 + "_" + s4)
        .addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                    User user  = dataSnapshot.getValue(User.class);
                    //ImageView im = (ImageView) findViewById(R.id.imageView);
                    //TextView tv1 = (TextView) findViewById(R.id.textView3);
                    //TextView tv2 = (TextView) findViewById(R.id.textView5);
                    ///im.setImageBitmap(user.image);
                    ///tv1.setText(user.name);
                    ///tv2.setText(user.number);


            }

            public void onCancelled(DatabaseError databaseError) {
                // Getting Post failed, log a message
                //Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
            }

        });

Я получаю это ошибка:

    java.lang.IllegalArgumentException: Service not registered: com.google.android.gms.measurement.internal.zzjc@45abe13
    at android.app.LoadedApk.forgetServiceDispatcher(LoadedApk.java:1105)
    at android.app.ContextImpl.unbindService(ContextImpl.java:1873)
    at android.content.ContextWrapper.unbindService(ContextWrapper.java:562)
    at com.google.android.gms.common.stats.ConnectionTracker.unbindService(Unknown Source)
    at com.google.android.gms.measurement.internal.zzik.zzah(com.google.android.gms:play-services-measurement-impl@@17.2.0:240)
    at com.google.android.gms.measurement.internal.zzik.zzak(com.google.android.gms:play-services-measurement-impl@@17.2.0:257)
    at com.google.android.gms.measurement.internal.zzik.zzc(com.google.android.gms:play-services-measurement-impl@@17.2.0:319)
    at com.google.android.gms.measurement.internal.zzij.zza(com.google.android.gms:play-services-measurement-impl@@17.2.0:2)
    at com.google.android.gms.measurement.internal.zzai.run(com.google.android.gms:play-services-measurement-impl@@17.2.0:7)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    at com.google.android.gms.measurement.internal.zzfy.run(com.google.android.gms:play-services-measurement-impl@@17.2.0:20)

Когда я комментирую User user = dataSnapshot.getValue(User.class); ошибка исчезает.

Что может быть не так?

1 Ответ

0 голосов
/ 05 января 2020

Когда вы выполняете запрос к базе данных Firebase, потенциально может быть несколько результатов. Таким образом, снимок содержит список этих результатов. Даже если есть только один результат, снимок будет содержать список из одного результата.

Таким образом, ваш onDataChange должен учитывать тот факт, что DataSnapshot может содержать несколько пользователей. Вы можете легко сделать это, зациклив dataSnapshot.getChildren() следующим образом:

mDatabase.child("users").orderByChild("name_title_company_location")
    .equalTo(s1 + "_" + s2 + "_" + s3 + "_" + s4)
    .addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot userSnapshot: dataSnapshot.getChildren) {
                User user = userSnapshot.getValue(User.class);
                ...
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...