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
- Modo correcto de hacer la migración de Realm
- RETROFIT POST Objeto Realm
- Realm: cambia el nombre del campo para la migración
- Android Realm número de versión de migración basado en qué?
- Problemas de serialización de RealmList (Realm / Gson / Intent)
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
- Hacer que GSON & Realm juegue bien
- Migración en Realm 0.81.1
- ¿Es el cierre y la reapertura de las instancias de Realm malas para el rendimiento?
- Migración de Realm de Android: Agregar nueva columna de lista de Realm
- ¿Qué clave principal se debe establecer en el db de Android local antes de sincronizarlo con el servidor?
- Persistencia de objetos con Realm (error: Cambiar datos de Realm sólo se puede hacer desde dentro de una transacción)
- La migración de Realm se está estrellando en Android 7.1.2
- Cómo manejar la migración de dominios si los usuarios omitir las actualizaciones
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.