2017-10-14 3 views
1

Ich benutze Room Database, versuche eine Abfrage in meinem Dao zu schreiben, die alle Datensätze löscht, die älter als eine bestimmte Anzahl von Tagen sind. Hier ist, was ich komme zu:Android Room Database Fehler: Ungenutzter Parameter: Tage in @Query Funktion

@Query("DELETE FROM my_table WHERE dateFrom <= date('now','-:days day')") 
fun deleteAllOlderThan(days: Int) 

aber wenn ich versuche, mein Projekt zu erstellen, erhalte ich einen Fehler in meiner Gradle Console:

error: Unused parameter: days

ich Kotlin verwende, so ist es mir zeigen auch diese :

Error:Execution failed for task ':nexo:kaptDebugKotlin'. Internal compiler error. See log for more details

Was ist falsch mit meiner Abfrage?

UPDATE

ich auch bin immer eine Fehlermeldung über Datum konvertieren. Hier ist mein Konverter:

class Converter { 
@TypeConverter 
fun fromTimestamp(value: Long?) = value?.let { Date(it) } 

@TypeConverter 
fun dateToTimestamp(date: Date?) = date?.time 
} 

ich auch zu meiner Datenbank mit Anmerkung hinzufügen:

@TypeConverters(Converter::class) 

Hier spezifische Fehler i erhalten:

Cannot figure out how to save this field into database. You can consider adding a type converter for it. e: e:private final java.util.Date dateFrom = null;

ZUSAMMENFASSUNG

  1. Ich habe versucht, Converter mit versiegelter Klasse zu verwenden, was in Room Probleme verursacht, also entschied ich mich, meinen Date-Parameter als Long zu behalten.

  2. Überprüfen Sie Emmanuel S Antwort. Es sollte sein:

    @Query("DELETE FROM my_table WHERE dateFrom <= date('now', '-' || :days || ' days')") 
    fun deleteAllOlderThan(days: Int) 
    
+0

Ich vermute, dass Sie nicht ': days' innerhalb einer Zeichenfolge in Anführungszeichen verwenden können. All Room macht gerade um SQLite-Platzhalter herum. Versuchen Sie die Verkettung von Strings. – CommonsWare

+0

Danke, ich werde das versuchen, sehe auch mein Update, wenn du willst, ich habe kein anderes Problem bemerkt – Konrad

+0

poste deine Datenbank Klasse .. :-) –

Antwort

3

Ich denke, CW die Antwort bereits für Ihre gab: Tage Problem.

Sie Tage muss als String wie

"-20 day" 


@Query("DELETE FROM my_table WHERE dateFrom <= date('now', :days)") 
fun deleteAllOlderThan(days: String) 

zitiert werden, wenn seine nicht funktioniert concat helfen können.

Versuchen:

@Query("DELETE FROM my_table WHERE dateFrom <= date('now', '-' || :days || ' days')") 
fun deleteAllOlderThan(days: Int) 

Für Ihre Converter Ausgabe Sie können

@TypeConverter 
fun fromTimestamp(value: Long?) = value?.let { Date(it) } 

@TypeConverter 
fun dateToTimestamp(date: Date?) = date?.time 

, die funktioniert gut bedienen.

Verwenden Sie kein Begleitobjekt.Verwenden Sie einfach

class DBConverters { 
    @TypeConverter 
    fun fromTimestamp(value: Long?) = value?.let { Date(it) } 

    @TypeConverter 
    fun dateToTimestamp(date: Date?) = date?.time 
} 

und fügen Sie den Converter auf Ihre abstrakte DB Klasse wie

@TypeConverters(DBConverters::class) 
abstract class YourDb : RoomDatabase() {} 
+0

Ich machte ein Update, vielleicht können Sie jetzt helfen. Ich benutze auch Ihre Konvertierung – Konrad

+0

Ich habe ein Update gemacht, ich habe Fehler: Die Klasse wird als ein Konverter referenziert, aber es hat keine Konverter-Methoden. – Konrad

+0

aktualisierte meine Antwort. versuche concat zu benutzen. Ich bin nicht sicher, ob die Syntax funktioniert. –

1

über Fehler: Nicht verwendeten Parameter: Tage

Derzeit Zimmer können keine Argumente Namen lesen, wenn Kotlin verwenden. Versuchen Sie stattdessen arg0 oder p0 zu verwenden, wie zum Beispiel:

Verwandte Themen