Android chambre persistante de la bibliothèque - TypeConverter erreur de erreur: Impossible de trouver comment sauver champ de base de données"
Je ne suis pas en mesure de créer un typeConverter dans la chambre en raison d'une erreur. Je semble être la suite tout par les docs. Je voudrais convertir une liste à une chaîne json. permet de jeter un coup d'oeil à mon entité:
@Entity(tableName = TABLE_NAME)
public class CountryModel {
public static final String TABLE_NAME = "Countries";
@PrimaryKey
private int idCountry;
/* I WANT TO CONVERT THIS LIST TO A JSON STRING */
private List<CountryLang> countryLang = null;
public int getIdCountry() {
return idCountry;
}
public void setIdCountry(int idCountry) {
this.idCountry = idCountry;
}
public String getIsoCode() {
return isoCode;
}
public void setIsoCode(String isoCode) {
this.isoCode = isoCode;
}
public List<CountryLang> getCountryLang() {
return countryLang;
}
public void setCountryLang(List<CountryLang> countryLang) {
this.countryLang = countryLang;
}
}
La country_lang est ce que je voudrais convertir une chaîne json. J'ai donc créé le convertisseur suivants:
Converters.java:
public class Converters {
@TypeConverter
public static String countryLangToJson(List<CountryLang> list) {
if(list == null)
return null;
CountryLang lang = list.get(0);
return list.isEmpty() ? null : new Gson().toJson(lang);
}}
alors le problème, c'est partout où j'ai mis le @TypeConverters({Converters.class}) je reçois un message d'erreur. Mais officiellement, c'est là où j'ai placé l'annotation pour obtenir le typeConverter enregistré:
@Database(entities = {CountryModel.class}, version = 1 ,exportSchema = false)
@TypeConverters({Converters.class})
public abstract class MYDatabase extends RoomDatabase {
public abstract CountriesDao countriesDao();
}
L'erreur que j'obtiens est:
Error:(58, 31) error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
avez-vous un convertisseur de
J'ai essayé, mais je préfère ne pas les aider. Même erreur
TypeConverter pour les listes ne fonctionne pas. Si cela ne fonctionne pas pour vous, vous avez sans doute oublier d'ajouter une méthode pour la conversion inverse.
String
à List<CountryLang>
? Je ne vois pas dans votre code. La chambre devra ainsi être en mesure de lire les données en arrière.J'ai essayé, mais je préfère ne pas les aider. Même erreur
TypeConverter pour les listes ne fonctionne pas. Si cela ne fonctionne pas pour vous, vous avez sans doute oublier d'ajouter une méthode pour la conversion inverse.
@TypeConverter public static List<CountryLang> jsonToCountryLang(String json)
OriginalL'auteur j2emanue | 2017-06-16
Vous devez vous connecter pour publier un commentaire.
C'est un problème commun que j'ai vu depuis que la Chambre a été annoncé. De la salle ne prend pas en charge la capacité de stocker des Listes directement, ni la capacité de convertir vers/à partir de Listes. Il prend en charge la conversion et le stockage des POJO.
Dans ce cas la solution est simple. Au lieu de stocker un
List<CountryLang>
vous souhaitez stockerCountryLangs
(notez le "s"),J'ai fait un rapide exemple d'une solution ici :
Ce POJO est une inversion de votre objet précédent. C'est un objet qui stocke une liste de langues. Au lieu d'une liste d'objets que le magasin de votre langue.
Ce convertisseur prend une liste de chaînes de caractères et les convertit en une séparation par virgule chaîne à être stockées dans une seule colonne. Quand il récupère la chaîne à partir de la db SQLite pour convertir en arrière, il se divise la liste des virgules, et remplit les CountryLangs.
Assurer de mettre à jour votre RoomDatabase version après avoir fait ces changements.Vous avez le reste de la configuration correcte. Heureux de chasse avec le reste de votre Salle de persistance de travail.
Je vais jeter un oeil, poste en tant que question, de sorte que d'autres personnes pourront facilement être en mesure de trouver la question + réponse. Aider la communauté 🙂
Utiliser la Liste d'Énumérations stackoverflow.com/q/44698415/2163045
J'ai posté ma réponse
Récemment, j'ai eu des problèmes avec cette approche, combinée avec
@Embedded
. La chambre a dit qu'ilCannot figure out how to save this field into database
. Quelqu'un at-il une idée sur le pourquoi de ce qui pourrait arriver?OriginalL'auteur Jack Dalton
Avait même message d'erreur: "Impossible de trouver comment sauver ce champ dans la base de données" tout en essayant d'ajouter un champ Date. Dû ajouter un convertisseur de classe et d'ajouter @TypeConverters annotation de champ.
Exemple:
WordEntity.java
DateConverter.java:
OriginalL'auteur live-love
@TypeConverter
ne reconnaît pasList
classe, de sorte que vous devriez utiliserArrayList
au lieu de cela, de sorte que vous n'avez pas besoin supplémentaire de l'enveloppe pour la liste que vous souhaitez persister.List
àArrayList
mais encore recevoirerror: Cannot figure out how to save this field into database. You can consider adding a type converter for it. private java.util.ArrayList<java.lang.String> notificationTypes; ^
nous sommes à l'aide de
Kotlin
, donc aveckotlin.collections.ArrayList
il a été très bien pour des objets personnalisés. Pour lekotlin.String
il n'y avait pas besoin d'utiliserArrayList
, il était bien avec de simpleskotlin.collections.List
OriginalL'auteur Eduards Pozarickis
Vous devez également créer cette
TypeConverter
qui va convertir votreList
àString
,Et pour plus d'info, vous pouvez également vérifier mon autre réponse.
OriginalL'auteur Aman Gupta - ShOoTeR
Kotlin exemple (pas bon mais simple, TODO: json):
OriginalL'auteur norbDEV
J'ai utilisé le type de convertisseurs décrit ici (Article en Medium.com) et il a travaillé:
new Gson
dans un champ. C'est un objet lourd et prend du temps à créer, vous ne voulez pas créer une nouvelle instance à chaque fois que le convertisseur est appelé. Il en va de même pour le type de jeton.OriginalL'auteur MorZa