Android Realm, съхраняващ int[] и String[]

Има ли начин за съхраняване на int[] и String[], различен от създаването на нов обект, който ги съдържа, и след това съхраняването му в realmList

Имам обект, който приема параметрите на String, int[] и String[]. не можете да съхранявате int[] и String[] в realm, така че направих обект

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;
    }
}

и

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;
    }
}

и след това ги съхранявам като умножители на RealmList; RealmList тренировки;

Чудя се дали има начин да ги съхранявам, като просто използвам масив вместо RealmList


person Brady131313    schedule 24.01.2015    source източник
comment
Имаме нужда от повече подробности тук   -  person Caffeinated    schedule 24.01.2015


Отговори (3)


Emanuele от Realm тук. В момента няма друг начин освен да опаковате String или int и да използвате RealmList за тях. Това е поради няколко причини, включително възможността да използвате файла Realm на различни платформи. Това приемливо решение ли е във вашия случай на употреба или е болка?

Ако желаете, тази същност демонстрира как човек би използвал RealmList за съхраняване на група от примитивни стойности в рамките на RealmObject. https://gist.github.com/cmelchior/1a97377df0c49cd4fca9

person Emanuelez    schedule 24.01.2015
comment
Това прави нещата по-трудни, защото трябва да създавам обектите и да променям параметрите, което прави много по-трудно динамичното добавяне на неща към моя масив - person Brady131313; 24.01.2015
comment
Къде и как мога да изтегля файла .realm от моето устройство, за да го прегледам в браузъра на realm - person Brady131313; 24.01.2015
comment
Файлът Realm по подразбиране се намира в директорията, указана от context.getFilesDir(). Освен ако не използвате емулатора (или руутнато устройство), не можете да изтеглите този файл от телефона поради разрешения, но можете да съхраните Realm файла във външно хранилище, ако желаете, и в този момент той е достъпен. - person Emanuelez; 25.01.2015
comment
Във връзка с това, трябва да добавя обект в моята база данни за realm, но този обект съдържа обект LatLng вътре (който е клас на Google Maps и нямам достъп до неговия код). Възможно ли е да го добавя по някакъв начин? - person rosu alin; 06.03.2015
comment
Не е възможно да се съхраняват класове на трети страни. Това, което можете да направите, е да извлечете каквито и да е стойности, от които се нуждаете, за да пресъздадете LatLng обект и вместо това да съхраните такива стойности. - person Emanuelez; 09.03.2015
comment
Хей @Emanuelez актуализира ли това решение през последните няколко месеца? Има ли по-добър начин да направите това сега? - person Michael Alan Huff; 29.04.2015

Създайте клас RealmString както по-долу

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;
    }
}

Създайте нов клас

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;
    }
}

Ако използвате realm с преоборудване, добавете следните редове към вашия клас за преоборудване

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();
        }
person Amol Suryawanshi    schedule 16.02.2017
comment
realmStrings.add(new RealmString(stringElement.getAsString())); беше спасителят - person rookieDeveloper; 24.05.2017
comment
Пропуснах персонализирания GSON обект при инициализацията на Retrofit, докато не кацнах на onFailure() на повикването всеки път... сега мога да стигна до onResponse()! Много ми помогнахте! :) - person Geryson; 01.06.2017

Не ми харесва да използвам 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
comment
@тук вижте това, защо този отговор изглежда по-добър: hackernoon .com/ извън темата: избрахте вашето решение - person guness; 21.03.2017