Попытка установить вложенный объект - Получение «IllegalArgumentException: Неверные данные. Неподдерживаемый тип» - PullRequest
0 голосов
/ 06 мая 2018

У меня есть объект Race, который имеет свойство randomArticlesPair. Это свойство инициализируется как null. Вот как document объекта выглядит в базе данных:

enter image description here

Я бы хотел set свойство randomArticlesPair позже и поставить custom object вместо этого, и вот как я это делаю:

CollectionReference usersRef= FirebaseFirestore.getInstance().collection(FirebaseConstants.USERS);
DocumentReference senderRef=usersRef.document(raceRoom.getSenderEmail()).collection(FirebaseConstants.RACES_FEED).document(raceRoomID);

Map<String,Object> randomArticlesPair=new HashMap<>();
randomArticlesPair.put(FirebaseConstants.RANDOM_ARTICLES_PAIR,raceRoom.getRandomArticlesPair());

senderRef.set(randomArticlesPair,SetOptions.merge());

Это объект RandomArticlePair, который я пытаюсь вставить:

public class RandomArticlesPair {

    private RandomArticle randomArticleA;
    private  RandomArticle randomArticleB;

    public RandomArticlesPair(){}

    public RandomArticlesPair(RandomArticle randomArticleA, RandomArticle randomArticleB) {
        this.randomArticleA = randomArticleA;
        this.randomArticleB = randomArticleB;
    }

    public RandomArticle getRandomArticleA() {
        return randomArticleA;
    }

    public RandomArticle getRandomArticleB() {
        return randomArticleB;
    }
}

Его свойства - два RandomArticle объекта:

@IgnoreExtraProperties
public class RandomArticle {
    private String title, firstParagraph, id, url;
    @Exclude private List<Linkshere>backTemplates_List;
    @Exclude private List<Backlink>backlinks_List;

    public RandomArticle(){}

    public RandomArticle(String title, String firstParagraph, String id, String fullUrl){
        this.title=title;
        this.firstParagraph=firstParagraph;
        this.id=id;
        this.url=fullUrl;
    }

    public RandomArticle(String title, String fullUrl){
        this.title=title;
        this.url=fullUrl;
    }

    public RandomArticle(String title, String firstParagraph, String id, String fullUrl, List<Linkshere>backTemplates_List){
        this.title=title;
        this.firstParagraph=firstParagraph;
        this.id=id;
        this.url=fullUrl;
        this.backTemplates_List=backTemplates_List;

    }

    public String getTitle(){
        return this.title;
    }

    public String getFirstParagraph(){
        return this.firstParagraph;
    }

    public String getId(){
        return this.id;
    }

    public String getURL(){
        return this.url;
    }

    @Exclude public List<Linkshere> getBacktemplatesList(){
        return this.backTemplates_List;
    }

    @Exclude public void setBacklinks_List(List<Backlink> backlinks_List) {
        this.backlinks_List = backlinks_List;
    }

    @Exclude public List<Backlink> getBacklinksList(){
        return this.backlinks_List;
    }

}

Моя проблема в том, что после попытки добавить новые данные я получаю эту ошибку:

05-06 22:59:17.313 2991-2991/com... E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com..., PID: 2991
    java.lang.IllegalArgumentException: Invalid data. Unsupported type: com....infrastructure.objects.random_article.RandomArticlesPair (found in field randomArticlesPair)
        at com.google.firebase.firestore.UserDataConverter$zza.zzb(SourceFile:232)
        at com.google.firebase.firestore.UserDataConverter.zzb(SourceFile:578)
        at com.google.firebase.firestore.UserDataConverter.zza(SourceFile:452)
        at com.google.firebase.firestore.UserDataConverter.zza(SourceFile:479)
        at com.google.firebase.firestore.UserDataConverter.zza(SourceFile:445)
        at com.google.firebase.firestore.UserDataConverter.parseMergeData(SourceFile:275)
        at com.google.firebase.firestore.DocumentReference.set(SourceFile:149)
        at com....multiplayer.races.RaceActivity_Sender$6.onDataChange(RaceActivity_Sender.java:199)
        at com.google.firebase.database.zzp.onDataChange(Unknown Source:7)
        at com.google.android.gms.internal.firebase_database.zzfc.zza(Unknown Source:13)
        at com.google.android.gms.internal.firebase_database.zzgx.zzdr(Unknown Source:2)
        at com.google.android.gms.internal.firebase_database.zzhd.run(Unknown Source:71)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

Вставка строки работает просто отлично:

randomArticlesPair.put(FirebaseConstants.RANDOM_ARTICLES_PAIR,"plain old string");

enter image description here


Как я могу это исправить?

1 Ответ

0 голосов
/ 07 мая 2018

Обычно ожидается, что вы будете использовать POJO или карты примитивных типов, но не будете их смешивать. В данном конкретном случае, поскольку у вас уже есть объект Race, я думаю, что вы можете просто написать его напрямую, а затем обновить его позже. Как то так:

Race race = createRaceObjectWithNullRandomArticlesPair();
senderRef.set(race);
...
race.setRandomArticlesPair(...);
senderRef.set(race, SetOptions.merge());

Будет ли это работать для вашей ситуации?


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

Например, вы могли бы передать Map.class методу DocumentSnapshot.toObject(), но из-за стирания типа java было бы трудно указать, что вы хотите сопоставить строки с объектами RandomArticlesPair. (Хотя на самом деле это не невозможно. Вы можете использовать подход, подобный описанному здесь: http://gafter.blogspot.ca/2006/12/super-type-tokens.html, но это немного не по теме, поскольку Firestore в настоящее время не поддерживает ничего подобного.)

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