Не спешите судить, основываясь только на названии, я знаю, что подобные вопросы задавались ранее, но эта проблема немного другая.Пожалуйста, потерпите меня и прочитайте.
Итак, я определил класс 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
вещи.Это связано только с моей деятельностью пользовательского интерфейса (и я все равно не использую ее явно).
То, что я пробовал:
- Исключая все, кроме 2 сеттеров для простых строк, какупоминалось выше.
- Я подумал, что, возможно, сам класс
BaseUser
имеет дело с Firestore, что вызывает проблемы, поэтому я попытался сделать то же самое за пределами класса.То же самое. - Я попробовал базу данных Firebase, а не Firestore.То же самое.
- Существуют другие классы, которые наследуют
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.Чего мне не хватает в этом случае?