Не ми харесва да използвам RealmString и RealmInt. Как например ще следите да ги изтриете отново, когато списъкът се промени?
Създадох персонализирано решение за комбинацията Realm - GSON (Retrofit), където те споделят един и същ обект на модела. Тествах само 10 json файла. Уведомете ме, ако намерите някакви проблеми и аз ще усъвършенствам това.
Първо, създайте String вместо int[] или String[] във вашия RealmObject:
/*
* Languages this user selected. Comma separated String.
*/
@SerializedName("languages")
private String languages;
След това създайте гетери и сетери за него. Имайте предвид, че StringUtils.join()
е мой собствен метод, ако никоя от библиотеките, които използвате, не го има, можете да го намерите навсякъде в мрежата.
/**
* 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(",")));
}
Ако използвате този гетър много, може да искате да създадете List<String>
, който не се записва в базата данни (@Ignore), но се използва за ускоряване на този метод (така че анализирането да се извършва само при промени/първи достъп).
След това създайте десериализатор за 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();
}
}
Добавете това към вашата GSON конфигурация, използвана от Retrofit:
GsonBuilder gsonBuilder = new GsonBuilder()
.registerTypeAdapter(new TypeToken<String>() {
}.getType(), new RealmPrimitiveArrayDeserializer());
Това е. Късмет.
person
Frank
schedule
09.03.2017