2017-10-16 4 views
-1

Dans Mon application, j'obtiens des données d'un service Web et les affiche dans la vue recycleur. Après cela, je prévois d'ajouter ces données dans la base de données sqlite locale et afficher ces données lorsque l'utilisateur ouvre une application sans connexion Internet.Manière professionnelle de gérer les classes de modèles lors de l'utilisation de l'application Android GSON et SQLight

est ici une simple classe de modèle que je utilise pour résultat JSON Pars à l'aide GSON

public class Repo implements Parcelable { 

    @SerializedName("id") 
    @Expose 
    private Integer id; 

    @SerializedName("name") 
    @Expose 
    private String name; 

    @SerializedName("url") 
    @Expose 
    private String url; 


    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeValue(this.id); 
     dest.writeString(this.name); 
     dest.writeString(this.url); 
    } 

    public Repo() { 
    } 

    protected Repo(Parcel in) { 
     this.id = (Integer) in.readValue(Integer.class.getClassLoader()); 
     this.name = in.readString(); 
     this.url = in.readString(); 
    } 

    public Integer getId() { 
     return id; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getUrl() { 
     return url; 
    } 

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

    public void setName(String name) { 
     this.name = name; 
    } 

    public void setUrl(String url) { 
     this.url = url; 
    } 

    public static final Creator<Repo> CREATOR = new Creator<Repo>() { 
     @Override 
     public Repo createFromParcel(Parcel source) { 
      return new Repo(source); 
     } 

     @Override 
     public Repo[] newArray(int size) { 
      return new Repo[size]; 
     } 
    }; 
} 

Je peux créer une classe de modèle presque identique pour représenter des données SQLite. Ici, j'utilise ORMlite. Mais c'est une situation très similaire pour les autres ORM. Mais au moment où j'essaie de sauvegarder ces données dans la base de données SQLite, j'ai déjà des objets de données dans les classes du modèle GSON. C'est une chose redondante copier un objet du modèle GSON et mettre ces valeurs dans le modèle SQLite. J'ai donc trouvé la solution ci-dessous en essayant d'utiliser la classe de modèle unique pour représenter les deux.

@DatabaseTable(tableName = Repo.TABLE_NAME) 
public class Repo implements Parcelable { 

    public static final String TABLE_NAME = "repo"; 

    @DatabaseField(columnName = "repo_id") 
    @SerializedName("id") 
    @Expose 
    private Integer id; 

    @DatabaseField(columnName = "name") 
    @SerializedName("name") 
    @Expose 
    private String name; 

    @SerializedName("url") 
    @Expose 
    private String url; 


    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeValue(this.id); 
     dest.writeString(this.name); 
     dest.writeString(this.url); 
    } 

    public Repo() { 
    } 

    protected Repo(Parcel in) { 
     this.id = (Integer) in.readValue(Integer.class.getClassLoader()); 
     this.name = in.readString(); 
     this.url = in.readString(); 
    } 

    public Integer getId() { 
     return id; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getUrl() { 
     return url; 
    } 

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

    public void setName(String name) { 
     this.name = name; 
    } 

    public void setUrl(String url) { 
     this.url = url; 
    } 

    public static final Creator<Repo> CREATOR = new Creator<Repo>() { 
     @Override 
     public Repo createFromParcel(Parcel source) { 
      return new Repo(source); 
     } 

     @Override 
     public Repo[] newArray(int size) { 
      return new Repo[size]; 
     } 
    }; 
} 

J'ai essayer avec différents types de classe modèle où il n'y avait String champs de type. Comme GSON utilise des types comme Integer, Boolean Cela m'empêche d'utiliser le même modèle pour SQLite parce que la base de données n'identifie pas Integer comme type, pour fonctionner, il doit être int.

Alors, quelle est la façon professionnelle de gérer cela? Je n'ai pas d'autre choix que de revenir à la méthode de création de deux classes de modèles séparées pour représenter SQLite et GSON.

+0

* Comme GSON utilise des types primitifs comme Integer, Boolean * ' Integer' n'est pas un type primitif, ni 'Boolean' ... define * La base de données n'identifie pas Entier * ... SQLite ne sait rien sur les types Java – Selvin

+0

Merci pour le point. Édité. –

Répondre

0

approche Yout est tout à fait correct, mais je pense que vous mettez trop d'effort de réinventer la roue

Vous pouvez facilement réaliser la tâche décrite à l'aide Room