Android: Firestore завершается с ошибкой «Обнаружены конфликтующие сеттеры с именем: setWallpaper» - PullRequest
0 голосов
/ 02 февраля 2019

Не спешите судить, основываясь только на названии, я знаю, что подобные вопросы задавались ранее, но эта проблема немного другая.Пожалуйста, потерпите меня и прочитайте.

Итак, я определил класс BaseUser следующим образом:

import android.support.annotation.NonNull;
import android.util.Log;

import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.Exclude;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.storage.FirebaseStorage;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;

public class BaseUser
{
    private static final String TAG = "BaseUser";

    /**
     * Firebase Authentication and Database
     */
    protected FirebaseAuth auth;
    protected FirebaseFirestore db;
    protected FirebaseStorage st;

    /**
     * General BaseUser Info
     */
    private String firstName;
    private String lastName;
    private List<String> phones;
    private List<String> emails;
    private List<AddressLocation> addresses;

    public BaseUser()
    {
        auth = FirebaseAuth.getInstance();
        db = FirebaseFirestore.getInstance();
        st = FirebaseStorage.getInstance();
        phones = new ArrayList<>();
        emails = new ArrayList<>();
        addresses = new ArrayList<>();
    }

    /**
     * Getters
     */

    public final String getFirstName()
    {
        return firstName;
    }

    public final String getLastName()
    {
        return lastName;
    }

    @Exclude
    public final List<String> getPhones()
    {
        return phones;
    }

    @Exclude
    public final List<String> getEmails()
    {
        return emails;
    }

    @Exclude
    public final List<AddressLocation> getAddresses()
    {
        return addresses;
    }

    /**
     * Special Getters
     */

    @Exclude
    public final String getPhone(int index)
    {
        return phones.get(index);
    }

    // SimilarStuff


    /**
     * Setters
     */

    @Exclude
    public final void setFirstName(String firstName)
    {
        this.firstName = firstName;
    }

    @Exclude
    public final void setLastName(String lastName)
    {
        this.lastName = lastName;
    }

    @Exclude
    public final void setPhones(List<String> phones)
    {
        this.phones = phones;
    }

    @Exclude
    public final void setEmails(List<String> emails)
    {
        this.emails = emails;
    }

    @Exclude
    public final void setAddresses(List<AddressLocation> addresses)
    {
        this.addresses = addresses;
    }

    /**
     * Special Setters
     */

    @Exclude
    public final void addPhone(String phone)
    {
        this.phones.add(phone);
    }

    // SimilarStuff

    /**
     * Authentication
     */
    @Exclude
    public final boolean isLoggedIn()
    {
        assert(auth != null);
        return (auth.getCurrentUser() != null);
    }

    /**
     * Shared BaseUser Instance
     */

    protected static BaseUser holder = new BaseUser();

    @Exclude
    public static BaseUser getInstance()
    {
        assert(holder != null);
        return holder;
    }

    /**
     * Database
     */

    @Exclude
    protected final void downloadUser(final Callable<Void> callback)
    {
        // Doesn't get called for now.
    }

    @Exclude
    protected final void uploadUser()
    {
        assert(isLoggedIn());
        db.collection("users").document(auth.getCurrentUser().getUid()).set(this).addOnFailureListener(new OnFailureListener()
        {
            @Override
            public void onFailure(@NonNull Exception e)
            {
                Log.wtf(TAG, "Failed to write user data");
            }
        });
    }
}

, как вы можете видеть, класс определяет пару строк вместе спара массивов.И не включает в себя абсолютно ничего, что может иметь setWallpaper.Кроме того, как вы можете видеть, чтобы определить источник ошибки, я буквально исключил все функции (да, даже если они не начинаются с set или get), за исключением двух функций, которые читаютдве простые строки.

Теперь, когда вызывается метод uploadUser, я получаю следующую ошибку:

java.lang.RuntimeException: Found conflicting setters with name: setWallpaper (conflicts with setWallpaper defined on android.content.ContextWrapper)
        at com.google.firebase.firestore.util.CustomClassMapper$BeanMapper.<init>(com.google.firebase:firebase-firestore@@18.0.0:632)
        at com.google.firebase.firestore.util.CustomClassMapper.loadOrCreateBeanMapperForClass(com.google.firebase:firebase-firestore@@18.0.0:348)
        at com.google.firebase.firestore.util.CustomClassMapper.serialize(com.google.firebase:firebase-firestore@@18.0.0:169)
        at com.google.firebase.firestore.util.CustomClassMapper.access$300(com.google.firebase:firebase-firestore@@18.0.0:53)
        at com.google.firebase.firestore.util.CustomClassMapper$BeanMapper.serialize(com.google.firebase:firebase-firestore@@18.0.0:774)
        at com.google.firebase.firestore.util.CustomClassMapper.serialize(com.google.firebase:firebase-firestore@@18.0.0:170)
        at com.google.firebase.firestore.util.CustomClassMapper.access$300(com.google.firebase:firebase-firestore@@18.0.0:53)
        at com.google.firebase.firestore.util.CustomClassMapper$BeanMapper.serialize(com.google.firebase:firebase-firestore@@18.0.0:774)
        at com.google.firebase.firestore.util.CustomClassMapper.serialize(com.google.firebase:firebase-firestore@@18.0.0:170)
        at com.google.firebase.firestore.util.CustomClassMapper.access$300(com.google.firebase:firebase-firestore@@18.0.0:53)
        at com.google.firebase.firestore.util.CustomClassMapper$BeanMapper.serialize(com.google.firebase:firebase-firestore@@18.0.0:774)
        at com.google.firebase.firestore.util.CustomClassMapper.serialize(com.google.firebase:firebase-firestore@@18.0.0:170)
        at com.google.firebase.firestore.util.CustomClassMapper.serialize(com.google.firebase:firebase-firestore@@18.0.0:101)
        at com.google.firebase.firestore.util.CustomClassMapper.convertToPlainJavaTypes(com.google.firebase:firebase-firestore@@18.0.0:77)
        at com.google.firebase.firestore.UserDataConverter.convertAndParseDocumentData(com.google.firebase:firebase-firestore@@18.0.0:216)
        at com.google.firebase.firestore.UserDataConverter.parseSetData(com.google.firebase:firebase-firestore@@18.0.0:75)
        at com.google.firebase.firestore.DocumentReference.set(com.google.firebase:firebase-firestore@@18.0.0:174)
        at com.google.firebase.firestore.DocumentReference.set(com.google.firebase:firebase-firestore@@18.0.0:153)
        at com.companyname.projectname.authentication.SignupActivity$6$1$1.onComplete(SignupActivity.java:297)
        at com.google.android.gms.tasks.zzj.run(Unknown Source:4)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6718)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Я щелкнул своей папкой, чтобы выяснить, что включает в себя setWallpaper, и нашелследующее:

shell$ grep -rnw "setWallpaper" .
Binary file ./authentication/build/intermediates/transforms/instantRun/AppName/debug/0/com/companyname/projectname/authentication/ResetPasswordActivity.class matches
Binary file ./authentication/build/intermediates/transforms/instantRun/AppName/debug/0/com/companyname/projectname/authentication/WelcomeActivity.class matches
Binary file ./authentication/build/intermediates/transforms/instantRun/AppName/debug/0/com/companyname/projectname/authentication/SignupActivity.class matches
Binary file ./authentication/build/intermediates/transforms/instantRun/AppName/debug/0/com/companyname/projectname/authentication/LoginActivity.class matches
Binary file ./authentication/build/intermediates/transforms/instantRun/AppName/debug/0/com/companyname/projectname/authentication/PhoneVerificationActivity.class matches
Binary file ./authentication/build/intermediates/transforms/dexBuilder/AppName/debug/265/com/companyname/projectname/authentication/LoginActivity.dex matches
Binary file ./authentication/build/intermediates/transforms/dexBuilder/AppName/debug/265/com/companyname/projectname/authentication/WelcomeActivity.dex matches
Binary file ./authentication/build/intermediates/transforms/dexBuilder/AppName/debug/265/com/companyname/projectname/authentication/PhoneVerificationActivity.dex matches
Binary file ./authentication/build/intermediates/transforms/dexBuilder/AppName/debug/265/com/companyname/projectname/authentication/ResetPasswordActivity.dex matches
Binary file ./authentication/build/intermediates/transforms/dexBuilder/AppName/debug/265/com/companyname/projectname/authentication/SignupActivity.dex matches
Binary file ./authentication/build/intermediates/transforms/dexMerger/AppName/debug/1/classes.dex matches

Так что BaseUser не имеет абсолютно никакого отношения к этой setWallpaper вещи.Это связано только с моей деятельностью пользовательского интерфейса (и я все равно не использую ее явно).

То, что я пробовал:

  1. Исключая все, кроме 2 сеттеров для простых строк, какупоминалось выше.
  2. Я подумал, что, возможно, сам класс BaseUser имеет дело с Firestore, что вызывает проблемы, поэтому я попытался сделать то же самое за пределами класса.То же самое.
  3. Я попробовал базу данных Firebase, а не Firestore.То же самое.
  4. Существуют другие классы, которые наследуют BaseUser.Я отключил их всех.Так же.(Я даже не уверен, почему это может быть проблемой!)

Дополнительная информация

Я не уверен, имеет ли значение следующее, но учитывая странную природуошибка, я просто собираюсь выбросить его здесь в любом случае.

Класс BaseUser находится в отдельном модуле с именем user.Классы пользовательского интерфейса, которые имеют дело с аутентификацией (и перечислены в выводе grep выше), находятся в отдельном модуле, называемом authentication.Третий модуль core определяет зависимости библиотеки firebase и необходимую информацию от google-services.json.

Я должен также упомянуть, что с этой конфигурацией модулей я могу использовать Firebase Authentication очень хорошо.Только Firestore или Firebase Database имеют проблемы.

Вопрос

Теперь, с какой стати Firestore жалуется на сеттера, которого нет даже в моем классе?Как это исправить?

Редактировать 1

Сейчас я попробовал две разные вещи:

Вместо этого я попытался загрузить простую карту, поэтому внутри функции uploadUser я добавилследующее:

protected final void uploadUser()
{
    assert(isLoggedIn());
    Map<String, Object> city = new HashMap<>();
    city.put("name", "Los Angeles");
    city.put("state", "CA");
    city.put("country", "USA");
    db.collection("users").document(auth.getCurrentUser().getUid()).set(city);
}

, который работал нормально, затем я попытался добавить простой класс в качестве объекта для загрузки.следующим образом:

protected final void uploadUser()
{
    class Stupid {
        public String name;
        public String email;

        public Stupid()
        {
        }

        public Stupid(String name, String email)
        {
            this.name = name;
            this.email = email;
        }

        public String getName()
        {
            return name;
        }

        public void setName(String name)
        {
            this.name = name;
        }

        public String getEmail()
        {
            return email;
        }

        public void setEmail(String email)
        {
            this.email = email;
        }
    }
    Stupid stupid = new Stupid("Name", "Email");
    db.collection("users").document(auth.getCurrentUser().getUid()).set(stupid);
}

Что, опять же, выдало мне ту же ошибку с setWallpaper.Я также попробовал другой вариант класса Stupid с целыми числами, а не со строками.Тоже самое.Глупый простой класс POJO.Что не так с этим всем ?!Раньше я все время использовал классы и объекты с базой данных Firebase.Чего мне не хватает в этом случае?

1 Ответ

0 голосов
/ 03 февраля 2019

Хорошо, поэтому я сделал две вещи, но не уверен, что из них исправили (может быть, оба?!)

Раньше я проверял доступность сервисов Google Play.Итак, для этого я включил com.google.android.gms:play-services-base:16.1.0.Что заставило меня получить ошибку Error: Cannot fit requested classes in a single dex file. Try supplying a main-dex list. # methods: 72477 > 65536.Мое решение было добавить multiDexEnable 'true'.То, что я сделал сейчас, было следующим: этот ответ .Поэтому я удалил все мульти-декс и использовал com.google.android.gms:play-services-gcm:16.0.0.

Второе, что я сделал, - отключил мгновенный запуск.

Теперь тот же самый код, который у меня есть, работает как брелок и может читать / писать в Firestore.

У меня нет никакого объяснения того, что происходило.Но проблема теперь ушла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...