web-dev-qa-db-fra.com

Salle "Vous ne savez pas comment convertir un curseur en type de retour de cette méthode": quelle méthode?

Error:Not sure how to convert a Cursor to this method's return type
Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
Compilation failed; see the compiler error output for details.

En utilisant Room je reçois cette erreur et j'aimerais savoir quelle méthode la cause. 

J'ai plusieurs DAOs, avec environ 60 méthodes au total, et cette erreur est apparue après l'ajout d'une méthode (copier et coller à partir d'une autre qui fonctionnait parfaitement, simplement changer le champ à définir). 

Je pourrais poster toute la classe de DAOs, mais je demande un moyen de savoir quelle méthode a échoué. J'ai essayé avec Run with --stacktrace, Run with --info et --debug option, mais aucun de ceux-ci ne montre d'informations précieuses.

La méthode que j'ai ajoutée est un @QueryUPDATE avec le type de retour Int, comme suggéré dans le documentation

Les requêtes UPDATE ou DELETE peuvent renvoyer void ou int. Si c'est un int, le valeur correspond au nombre de lignes affectées par cette requête.

EDIT: Je voudrais ajouter que j'ai essayé de supprimer la méthode, ramenant le DAO à l'état de travail, mais il me donne toujours cette erreur.

EDIT2: Ajout de la sortie de la console Gradle car illisible dans les commentaires:

error: Not sure how to convert a Cursor to this method's return type
error: Not sure how to convert a Cursor to this method's return type
2 errors

:app:compileDebugJavaWithJavac FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileDebugJavaWithJavac'.
Compilation failed; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

* Get more help at https://help.gradle.org

BUILD FAILED in 22s
10
David Corsalini

Oui, en fonction de ce que vous avez mentionné dans les commentaires, vous n'êtes pas autorisé à modifier le type de retour de List à quoi que ce soit d'autre à l'intérieur de Dao. Je suppose que Room ne sait pas comment traiter les autres types de retour. Prenez la List et lancez/convertissez-la dans le type souhaité en dehors de la Dao.

28
Ali Kazi

Dans mon cas, c’était ce problème lorsque j’utilisais LiveData<ArrayList<Example Class>> dans la classe Dao pour obtenir tout ce qui se passait dans la salle et que je le corrigeais lorsque je changeais ArrayList avec List.

Exemple (Kotlin):

@Dao
interface ExampleDao {
@Query("SELECT * from example_table")
fun getAllExample():LiveData<List<Example>>
}
3
Fidan Bacaj

Ajoutez le code ci-dessous dans defaultConfig dans build.gradle

javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true
1
vijay
 class IdAndFullName {
     public int uid;
     @ColumnInfo(name = "full_name")
     public String fullName;
 }
 // DAO
 @Query("SELECT uid, name || lastName as full_name FROM user")
 public IdAndFullName[] loadFullNames();

En cas d'incompatibilité entre le résultat de la requête et le POJO, Room vous donnera ce message d'erreur.

Ou si vous utilisez @SkipQueryVerification, vous obtiendrez également cette erreur.

0
live-love

Modifiez votre Dao, utilisez Flowable au lieu d’observable et ajoutez la dépendance suivante (salle avec support rxjava) 

compile group: 'Android.Arch.persistence.room', name: 'rxjava2', version: '1.1.1'

Dao retourne fluide:

@Query("SELECT * FROM TableX")
public abstract Flowable<List<EntityX>> getAllXs();
0
Mr.Q

Pour mon cas, after got "Vous ne savez pas comment convertir un curseur en type de retour de cette méthode":

supprimez la "construction" et reconstruisez, l'erreur disparaîtra.

0
David Guo

Car c’était à cause du mélange d’AndroidX avec Pre-AndroidX. Après une migration complète et effectuée , tout était rentré dans l'ordre. (Bien sûr, je suis aussi passé à AndroidX-Room)

0
Tanasis