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 DAO
s, 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 DAO
s, 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 @Query
UPDATE
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
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
.
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>>
}
Ajoutez le code ci-dessous dans defaultConfig dans build.gradle
javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true
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.
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();
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.
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)