2017-08-13 4 views
0

Je donne les résultats suivants Entitégetter Ambigu pour le champ ... bibliothèque de persistance Chambre

public class User { 
    @PrimaryKey 
    private final long id; 

    private String _id; 
    private String userName; 
    private String email; 
} 

Cependant, lorsque je tente de créer une table pour cette entité dans la bibliothèque à l'aide de la persistance de la chambre Android, je reçois l'erreur suivante.

Error:(18, 20) error: Ambiguous getter for Field(element=_id, name=_id, type=java.lang.String, affinity=TEXT, columnName=_id, parent=null, indexed=false). All of the following match: getId, get_id. You can @Ignore the ones that you don't want to match.

Le champ _id est inclus afin que je puisse traduire directement les réponses de la node.js api relié à une base de données mongodb.

+0

Si votre liste de classe est complète, je soupçonne que Room n'aime pas les champs ayant le même nom de base, ne différant que par le préfixe '_'. Pouvez-vous faire quelque chose du côté JSON, comme '@ SerializedName' avec Gson, pour permettre au champ d'avoir un nom différent (par exemple,' mongodb_id')? En outre, votre liste de cours est-elle complète ou y a-t-il des méthodes de lecture que votre liste actuelle ne montre pas? – CommonsWare

+0

vous voulez dire quand j'obtiens la réponse de l'API? va-t-il automatiquement sérialiser tous les champs _id dans mongodb_id? –

+0

Oui, je demande si c'est une possibilité. Je ne sais pas ce que vous utilisez pour votre API de client de service Web. Certains analyseurs JSON fonctionnant sous Android, tels que Gson, prennent en charge les annotations telles que '@ SerializedName', de sorte que le nom dans le JSON peut être différent du nom du champ Java. – CommonsWare

Répondre

1

Selon la documentation, vous devez déclarer getter pour chaque champ.

Je peux voir que vous n'avez pas déclaré votre classe avec l'annotation @Entity. Assurez-vous également que vous utilisez la dernière version de la bibliothèque car elle est encore en cours de développement, vous devez donc faire quelques changements révolutionnaires.

Voir ci-dessous l'exemple, il fonctionne très bien pour moi avec la version ci-dessous api de la pièce.

api 'android.arch.persistence.room:runtime:1.0.0-alpha8' 

Ou vous pouvez également utiliser "alpha9". Espérons que cela va résoudre votre problème.

@Entity (tableName = "user") 
public class User { 

@PrimaryKey 
private int id; 

private String _id; 

@ColumnInfo(name = "user_name") 
private String userName; 

@NonNull 
private String passwrod; 

public User(String userName, @NonNull String passwrod) { 
    this.userName = userName; 
    this.passwrod = passwrod; 
} 

@Ignore 
public User() { 
} 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getUserName() { 
    return userName; 
} 

public void setUserName(String userName) { 
    this.userName = userName; 
} 

public String getPasswrod() { 
    return passwrod; 
} 

public void setPasswrod(String passwrod) { 
    this.passwrod = passwrod; 
} 

public String get_id() { 
    return _id; 
} 

public void set_id(String _id) { 
    this._id = _id; 
} 

}

2

vous devez avoir setter et getter pour chaque champ privé que vous pouvez les rendre publics, une autre raison qui peut provoquer cette erreur est d'avoir deux ou getters setters pour un champ.

0

Les types de retour pour les getters doivent être identiques au type de données d'attribut, si vous avez un attribut de type de données int, lorsque j'ai découvert qu'il corrigeait mon problème.

Bonne chance.