Android Realm que almacena int y String

¿Hay una manera de almacenar un int [] y una cadena [], con excepción de crear un nuevo objeto que los contiene, y después almacenarlo en un realmList

Tengo un objeto que toma los parámetros de una String, int [], y String []. Usted no puede almacenar int [], y String [] en el reino así que hice un objeto

public class Workouts extends RealmObject { private String workout; public Workouts() { } public Workouts(String workout) { this.workout = workout; } public String getWorkout() { return workout; } public void setWorkout(String workout) { this.workout = workout; } } 

y

 public class Multiplier extends RealmObject { private int multiplier; public Multiplier() { } public Multiplier(int multiplier) { this.multiplier = multiplier; } public int getMultiplier() { return multiplier; } public void setMultiplier(int multiplier) { this.multiplier = multiplier; } } 

Y luego los almaceno como multiplicadores de RealmList; Entrenamientos de RealmList;

Me estoy preguntando si hay una manera que puedo almacenar éstos apenas usando una matriz en vez de una RealmList

Emanuele de Realm aquí. En este momento no hay otra forma que no sea la de encapsular String o int y usar RealmList en esos. Esto es por varias razones, incluyendo ser capaz de usar el archivo Realm en diferentes plataformas. ¿Es esta una solución aceptable en su caso de uso o es un dolor?

Si lo desea, esta teoría demuestra cómo se usaría una RealmList para almacenar un grupo de valores primitivos dentro de un RealmObject. https://gist.github.com/cmelchior/1a97377df0c49cd4fca9

Cree la clase RealmString como a continuación

 public class RealmString extends RealmObject { private String val; public RealmString(){ } public RealmString(String value) { this.val = value; } public String getValue() { return val; } public void setValue(String value) { this.val = value; } @Override public String toString() { return val; } } 

Crear nueva clase

 public class RealmStringDeserializer implements JsonDeserializer<RealmList<RealmString>> { @Override public RealmList<RealmString> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { RealmList<RealmString> realmStrings = new RealmList<>(); JsonArray stringList = json.getAsJsonArray(); for (JsonElement stringElement : stringList) { realmStrings.add(new RealmString(stringElement.getAsString())); } return realmStrings; } } 

Si está utilizando reino con retrofit, añada las siguientes líneas a su clase de constructor de reacondicionamiento

 Gson gson = new GsonBuilder() .setLenient() .setExclusionStrategies(new ExclusionStrategy() { @Override public boolean shouldSkipField(FieldAttributes f) { return f.getDeclaringClass().equals(RealmObject.class); } @Override public boolean shouldSkipClass(Class<?> clazz) { return false; } }) .registerTypeAdapter(new TypeToken<RealmList<RealmString>>() { }.getType(), new RealmStringDeserializer()) .create(); if (retrofit == null) { retrofit = new Retrofit.Builder() .baseUrl(NetworkConstants.BASE_URL) .addConverterFactory(GsonConverterFactory.create(gson)) .build(); } 

No me gusta usar RealmString y RealmInt. ¿Cómo, por ejemplo, mantendrá un registro de borrarlos de nuevo cuando cambie la lista?

He creado una solución personalizada para el realm – GSON (Retrofit) combi, donde comparten el mismo objeto de modelo. He probado sólo 10 archivos json. Déjame saber si encuentras algún problema y lo perfeccionaré.

En primer lugar, cree una String en lugar de un int [] o String [] en su RealmObject:

 /* * Languages this user selected. Comma separated String. */ @SerializedName("languages") private String languages; 

A continuación, crear getters y setters para ello. Tenga en cuenta que StringUtils.join() es mi propio método, si ninguna de las bibliotecas que usa tiene entonces usted puede encontrarlo en cualquier lugar de la red.

 /** * 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(","))); } 

Si utiliza este getter mucho, puede crear una List<String> que no se guarde en la base de datos (@Ignore), pero se utiliza para acelerar este método (de modo que el análisis se realiza sólo en los cambios / primer acceso).

A continuación, cree un deserializador para 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(); } } 

Añada esto a su configuración GSON utilizada por Retrofit:

 GsonBuilder gsonBuilder = new GsonBuilder() .registerTypeAdapter(new TypeToken<String>() { }.getType(), new RealmPrimitiveArrayDeserializer()); 

Eso es. Buena suerte.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.