0

Contexte: J'expérimente avec une application de messagerieParse SDK Android: ClassCastException lorsque LocalDatastore est activé et la liste des messages sous-classe est chargé à partir du serveur

Problème Description: Normalement Codesnipped 2 œuvres comme charme et charges les données du serveur. Mais lors de l'activation du LocalDatastore avec Codesnipped 1, l'erreur

java.lang.ClassCastException: com.parse.ParseObject ne peut pas être jeté à at.test.activity.Message

arrises. Message est une sous-classe de ParseObject. Lorsque vous regardez avec le débogueur à la ligne où l'erreur se produit, on peut voir que la liste qui est passée à la fonction done contient un seul objet du type "Message" dans la première postition et tous les autres éléments ont le type "ParseObject" (-> Capture d'écran: DebuggerOutput when local datastore is activated) . Sans le magasin de données local activé, chaque élément de cette liste est de type "Message".

Qu'est-ce que je fais mal? Merci d'avance!

Codesnipped 1:

Parse.initialize(new Parse.Configuration.Builder(this) 
.applicationId("test") 
.enableLocalDataStore() 
.clientBuilder(builder) 
.server("http://someinstallation.com/parse/") 
.build()); 

Codesnipped 2:

ParseQuery query = ParseQuery.getQuery(Message.class); 
ArrayList idsToQuery = new ArrayList<>(); 
idsToQuery.add(getSenderID()); 
idsToQuery.add(getRecipiantID()); 
query.whereContainedIn("sender", idsToQuery); 
query.whereContainedIn("recipiant", idsToQuery); 
query.orderByDescending("createdAt"); 
query.findInBackground(new FindCallback() { 
    public void done(List messages, ParseException e) { 
     if (e == null) { 
      addMessagesTomList(messages); 
     } 
     else { 
      Log.e("message", "Error Loading Messages" + e); 
     } 
    } 
}); ` 

Répondre

0

Je pense que vous avez oublié de faire quelques pas avant de commencé à utiliser vos sous-classes Parse ainsi afin de créer un sous class (Message dans votre cas) vous devez effectuer les opérations suivantes:

  1. Créer une nouvelle classe qui étend de la classe ParseObject
  2. Ajoutez les propriétés que vous voulez que cette sous-classe d'avoir via setters et getters
  3. annoter la nouvelle classe avec @ParseClassName (« Message »)

A la fin de votre sous-classe doit ressembler à ce qui suit:

import com.parse.ParseClassName; 
import com.parse.ParseObject; 

@ParseClassName("Message") 
public class CheckIn extends ParseObject { 

    public String getContent() { 
     return getString("content"); 
    } 

    public void setContent(String content) { 
     put("content", content); 
    } 

    public String getTitle() { 
     return getString("title"); 
    } 

    public void setTitle(String title) { 
     put("title", title); 
    } 

} 

Enfin aller à l'endroit où vous Parse SDK d'initialisation (généralement dans votre dossier de candidature) et enregistrer la nouvelle sous-classe que vous avez créé:

ParseObject.registerSubclass(Message.class); 

Si vous suivez les étapes ci-dessus, cela fonctionnera pour vous.