2017-10-14 12 views
1

J'utilise Room Databse, en essayant d'écrire une requête dans mon Dao, qui va supprimer tous les enregistrements plus anciens que le nombre de jours. Voici ce que je viens:Android Room Erreur de base de données: Paramètre inutilisé: jours dans la fonction @Query

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

Cependant, lorsque je tente de construire mon projet, je reçois une erreur dans ma Gradle Console:

error: Unused parameter: days

J'utilise Kotlin, il me montre aussi ce :

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

Quel est le problème avec ma requête?

MISE À JOUR

Je suis aussi obtenir une erreur sur la conversion de la date. Voici mon convertisseur:

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

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

Je suis également l'ajouter à ma base de données avec l'annotation:

@TypeConverters(Converter::class) 

Voici erreur spécifique que je reçois:

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;

RÉSUMÉ

  1. J'essayais d'utiliser Converter avec une classe scellée, ce qui cause des problèmes dans Room, donc j'ai décidé de garder mon paramètre de date comme Long.

  2. Vérifiez la réponse d'Emmanuel S. Il devrait être:

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

Je suppose que vous ne pouvez pas utiliser ': days' à l'intérieur d'une chaîne entre guillemets. Tout ce que Room fait est de contourner les espaces réservés de SQLite. Essayez la concaténation de chaînes. – CommonsWare

+0

Merci, je vais essayer, voir aussi ma mise à jour si vous voulez, je n'ai pas remarqué un autre problème – Konrad

+0

poster votre base de données .. :-) –

Répondre

3

Je pense que CW a déjà la réponse pour votre: question de jours.

jours Vous devez être cité comme une chaîne comme

"-20 day" 


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

Si sa ne fonctionne pas concat peut aider.

Essayez:

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

Pour votre question Converter vous pouvez utiliser

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

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

qui fonctionne très bien.

Ne pas utiliser un objet compagnon.Il suffit d'utiliser

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

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

et ajoutez le convertisseur à votre classe abstraite DB comme

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

J'ai fait une mise à jour, peut-être vous pouvez aider maintenant. J'utilise aussi votre conversion – Konrad

+0

J'ai fait une mise à jour, j'ai une erreur: Class est référencé comme un convertisseur mais il n'a pas de méthodes de conversion. – Konrad

+0

a mis à jour ma réponse. essayez d'utiliser concat. je ne sais pas si la syntaxe fonctionne. –

1

A propos de l'erreur: Paramètre non utilisé: jours

Chambre ne peut actuellement pas lire le nom des arguments lors de l'utilisation Kotlin. Essayez d'utiliser arg0 ou p0 à la place, comme:

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