Kamer “Weet niet zeker hoe een cursor moet worden geconverteerd naar het retourtype van deze methode”: welke methode?

Met behulp van RoomIk krijg deze foutmelding en ik zou graag willen weten welke methode dit veroorzaakt.

Ik heb meerdere Dao‘s, met in totaal ongeveer 60 methoden, en deze fout verscheen net na het toevoegen van een methode (kopiëren en plakken van een andere die perfect werkte, alleen het veld gewijzigd om in te stellen ).

Ik zou de hele klasse van Daos kunnen posten, maar Ik vraag om een ​​manier om erachter te komen welke methode faalde. Ik heb geprobeerd met Run with --stacktrace, Run with --infoen --debug option, maar geen van deze toont waardevolle informatie.

De methode die ik heb toegevoegd is een @QueryUPDATEmet het retourtype Int, zoals voorgesteld in de documentatie

UPDATE- of DELETE-query’s kunnen void of int. Als het een int is, is de
waarde is het aantal rijen waarop deze zoekopdracht betrekking heeft.

EDIT: ik wil hieraan toevoegen dat ik heb geprobeerd de methode te verwijderen, waardoor de DAO weer werkt, maar ik krijg nog steeds deze foutmelding.

EDIT2: gradle console-uitvoer toevoegen omdat deze onleesbaar is in opmerkingen:

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

Antwoord 1, autoriteit 100%

Onlangs had ik hetzelfde probleem, maar ik gebruikte Coroutinesbinnen de functie Dao, bijvoorbeeld:

@Query("SELECT * FROM Dummy")
suspend fun get(): LiveData<List<Dummy>>

En kon niet compileren, maar na het verwijderen van de suspendwerkte alles prima. Het is niet nodig bij het retourneren van LiveData. suspenden LiveDatalijken (vanaf nu) niet samen te werken.


Antwoord 2, autoriteit 58%

Ik besteed de hele dag aan dit onderwerp. de oplossing was heel simpel. Ik gebruikte zoiets eerder

@Query("SELECT * FROM myTable")
fun getAll(): MutableLiveData<ArrayList<myData>>

Toen ik nu ArrayList veranderde in List& MutableLiveData naar LiveDatahet werkt prima.

@Query("SELECT * FROM myTable")
fun getAll(): LiveData<List<myData>>

op basis van de antwoorden & opmerkingen over dit probleem Ik denk dat alleen kamerondersteuning List & LiveData omdat ik probeerde met op MutableLiveData & alleen ArrayList ook. geen van de combinaties werkte.

Ik hoop dat dit iemands paar uur zal helpen.


Antwoord 3, autoriteit 36%

Voor iedereen die hier landt en een coroutinestroomals retourtype gebruikt, krijgt u dit fout als u de functie per ongeluk laat onderbreken. Aangezien het een stroom retourneert, is het niet nodig om te onderbreken.

Dus in plaats van dit:

@Query("SELECT * FROM myTable WHERE id = :id")
suspend fun findById(id: Long): Flow<MyDataType>

gebruik dit (zonder onderbrekingsmodifier):

@Query("SELECT * FROM myTable WHERE id = :id")
fun findById(id: Long): Flow<MyDataType> 

4, Autoriteit 2%

Voor mij was het vanwege het mengen van Androidx met Pre-Androidx. Na een volledige migratie en dit uitvoeren , was alles weer normaal. (Natuurlijk verhuisde ik ook naar Androidx-Room)


Antwoord 5, autoriteit 2%

Het is verdwenen nadat ik heb geüpdatet naar de nieuwste versie Room – room_version = “2.4.0”


Antwoord 6

Voor mijn geval, nadat ik “Niet zeker weet hoe een cursor moet worden geconverteerd naar het retourtype van deze methode”:

verwijder de “build” en herbouw, de fout verdwijnt.


Antwoord 7

Voeg de onderstaande code toe aan defaultConfig in build.gradle

javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true

Antwoord 8

Voor mij gebruikte ik het verkeerde retourtype voor zoekopdrachten.


Antwoord 9

Zorg ervoor dat u opschorten niet samen met LiveData als retourtype gebruikt:

@Query("SELECT * FROM ...")
fun getAllTellsByReceiver(receiverUid: String): LiveData<List<Tell>>

Antwoord 10

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();

Als er een mismatch is tussen het zoekresultaat en de POJO, geeft Room je deze foutmelding.

Of als u @SkipQueryVerification gebruikt, krijgt u ook deze foutmelding.


Antwoord 11

Wijzig uw Dao, gebruik Flowable in plaats van waarneembaar en voeg de volgende afhankelijkheid toe (kamer met rxjava-ondersteuning)

compile group: 'android.arch.persistence.room', name: 'rxjava2', version: '1.1.1'

Dao retourneert vloeiend:

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

Antwoord 12

Voor mij was het om te veranderen van MutableLiveData naar LiveData als het retourtype van de get-methode.


Antwoord 13

Ik kreeg deze foutmelding toen ik probeerde een aantal statistische functies in de query uit te voeren, zoals som en telling en vervolgens aliassen in de kolomnamen te gebruiken.

select count(users.id) as userCount, ...

Het gebeurt zo dat de aliasnaam, zoals userCounthierboven, moet overeenkomenmet de veldnaam in het model.


Antwoord 14

Je moet de @Relation-annotatie opnemen in de klasse die door de methode wordt geretourneerd. Het is de enige manier waarop Room de relatie tussen de twee zou kunnen vaststellen.


Antwoord 15

Zorg ervoor dat er

Er is een probleem met de query: [SQLITE_ERROR] SQL-fout of ontbreekt
database (niet zo’n tabel: METRO)

fout in uw bouwlogboek vóór de fout die u in uw beschrijving noemde. Als dit het geval is, bent u misschien vergeten uw nieuwe entiteit Pojo toe te voegen aan de databaseklasse. zoiets als dit

@Database(entities = {Table.class,ForgottenTable.class}, version = 1) 
public abstract class Database extends RoomDatabase {
    //class codes
}

Antwoord 16

In mijn geval wist Room niet zeker hoe een cursor moest worden geconverteerd naar het retourtype van deze methode, d.w.z. ArrayList
dus ik heb een klein beetje veranderd, ik heb het omgezet in een lijst naar kotlin’s MutableListOf. Nu werkt het prima.


Antwoord 17

Deze fout verdwijnt nadat ik de Kotlin-versie heb gewijzigd van 1.5.21 terug naar 1.3.61

Other episodes