Non mi piace usare RealmString e RealmInt. Come per esempio ti ricorderai di eliminarli di nuovo quando la lista cambia?
Ho creato una soluzione personalizzata per il combo Realm - GSON (Retrofit), in cui condividono lo stesso oggetto modello. Ho provato solo 10 file json. Fammi sapere se trovi qualche problema e ti perfezionerò.
In primo luogo, creare una stringa invece di un int [] o String [] nel vostro RealmObject:
/*
* Languages this user selected. Comma separated String.
*/
@SerializedName("languages")
private String languages;
Quindi creare getter e setter per esso. Notare che StringUtils.join()
è il mio metodo, se nessuna delle librerie in uso lo utilizza, puoi trovarlo ovunque sulla rete.
/**
* All user languages.
*/
public void setLanguagesFromList(List<String> languages) {
String languagesStr = languages == null ? "" : StringUtils.join(languages, ",");
if (!TextUtils.equals(this.languages, languagesStr)) {
setDirty(true);
}
this.languages = languagesStr;
}
/**
* Returns an unmodifiableList with all user languages.
* <p>
* Use setLanguagesFromList with a new list to make changes.
*
* @return
*/
public List<String> getLanguagesList() {
return Collections.unmodifiableList(
languages == null ? new ArrayList<>() :
Arrays.asList(languages.split(",")));
}
Se si utilizza questo getter molto, si potrebbe desiderare di creare un List<String>
che non viene salvato nel database (@Ignore), ma viene utilizzata per accelerare questo metodo (in modo che l'analisi viene eseguita solo su modifiche/primo accesso).
quindi creare un Deserializer per GSON/Retrofit:
/**
* Used so that string (or any other primitive) arrays are parsed int one String. Realm cannot handle String arrays.
*/
public class RealmPrimitiveArrayDeserializer implements
JsonDeserializer<String> {
private final static String KOMMA = ",";
@Override
public String deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
if (json.isJsonNull()) {
return null;
}
if (json.isJsonArray()) {
StringBuilder targetStringBuilder = null;
JsonArray stringList = json.getAsJsonArray();
for (JsonElement element : stringList) {
if (element.isJsonPrimitive()) {
if (targetStringBuilder == null) {
targetStringBuilder = new StringBuilder();
}
targetStringBuilder.append(element.getAsString());
targetStringBuilder.append(KOMMA);
}
}
if (targetStringBuilder != null && targetStringBuilder.length() > 0) {
// remove the last komma:
targetStringBuilder.deleteCharAt(targetStringBuilder.length() - 1);
return targetStringBuilder.toString();
}
}
return json.getAsString();
}
}
Aggiungi questo per la configurazione GSON usata da Retrofit:
GsonBuilder gsonBuilder = new GsonBuilder()
.registerTypeAdapter(new TypeToken<String>() {
}.getType(), new RealmPrimitiveArrayDeserializer());
Questo è tutto. In bocca al lupo.
Abbiamo bisogno di maggiori dettagli qui – Coffee
aggiunto altro dettaglio – Brady131313
grazie !!!!!!!! – Coffee