2015-01-24 4 views
9

Gibt es eine Möglichkeit, eine int [] und einen String zu speichern [], andere als ein neues Objekt erstellen, die diejenigen enthält, und speichern sie dann in einem RealmlistAndroid Realm Speicherung int [] und String []

Ich habe ein Objekt, das die Parameter eines Strings, int [] und String [] nimmt. Sie kann nicht speichern int [] und String [] in Reich so machte ich ein Objekt

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

und

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

und dann habe ich sie wie Realmlist Multiplikatoren speichern; RealmList-Workouts;

Ich frage mich, ob es einen Weg gibt ich diese nur durch Verwendung eines Arrays speichern kann anstelle eines Realmlist

+0

Wir brauchen mehr Detail hier – Coffee

+0

hinzugefügt mehr Details – Brady131313

+0

danke !!!!!!!! – Coffee

Antwort

8

Emanuele von Realm hier. Im Moment gibt es keinen anderen Weg, als String oder int einzuschließen und RealmList auf diesen zu verwenden. Dies hat mehrere Gründe, einschließlich der Möglichkeit, die Realm-Datei auf verschiedenen Plattformen zu verwenden. Ist das eine akzeptable Lösung in Ihrem Anwendungsfall oder ist es ein Schmerz?

Wenn Sie möchten, veranschaulicht dieser Kern, wie man eine RealmList verwenden würde, um eine Gruppe primitiver Werte in einem RealmObject zu speichern. https://gist.github.com/cmelchior/1a97377df0c49cd4fca9

+0

Es macht die Dinge schwieriger, weil ich die Objekte erstellen und Parameter ändern muss, was es viel schwieriger macht, Sachen dynamisch zu meinem Array hinzuzufügen. – Brady131313

+0

Wo und wie kann ich die .realm-Datei von meinem Gerät ziehen, um im Realm zu sehen Browser – Brady131313

+0

Die Standard-Realm-Datei befindet sich in dem durch 'context.getFilesDir()' angegebenen Verzeichnis. Wenn Sie den Emulator (oder ein gerootetes Gerät) nicht verwenden, können Sie diese Datei nicht aufgrund von Berechtigungen vom Telefon abrufen, aber Sie können die Realm-Datei bei Bedarf im externen Speicher speichern und sind dann erreichbar. – Emanuelez

3

RealmString Klasse erstellen, wie unten

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

neue Klasse erstellen

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

Wenn Sie mit Retrofit mit Reich werden dann folgende Zeilen in Retrofit-Builder-Klasse hinzufügen

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(); 
     } 
+0

'realmStrings.add (neue RealmString (stringElement.getAsString()));' war der Retter – rookieDeveloper

+0

Ich habe das benutzerdefinierte GSON-Objekt bei der Retrofit-Initialisierung verpasst, bis ich auf OnFailure() jedes Mal gelandet bin ... jetzt kann ich erreichen onResponse()! Du hast mir sehr geholfen! :) – Geryson

1

Ich mag es nicht, RealmString und RealmInt zu verwenden. Wie behalten Sie zum Beispiel das Löschen bei, wenn sich die Liste ändert?

Ich habe eine benutzerdefinierte Lösung für den Reich - GSON (Retrofit) Kombi, wo sie das gleiche Modellobjekt teilen. Ich habe nur 10 JSON-Dateien getestet. Lassen Sie mich wissen, wenn Sie irgendwelche Probleme finden, und ich werde das perfektionieren.

Zunächst erstellen String anstelle eines int [] oder String [] in Ihrer RealmObject:

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

Dann Getter und Setter für sie erstellen. Beachten Sie, dass StringUtils.join() meine eigene Methode ist, wenn keine der Bibliotheken, die Sie verwenden, es hat, dann können Sie es überall im Netz finden.

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

Wenn Sie diese Getter viel verwenden, können Sie wollen eine List<String> erstellen, die nicht in der Datenbank (@Ignore) gespeichert wird, sondern verwendet wird, um dieses Verfahren zu beschleunigen (so dass das Parsen nur auf Änderungen erfolgt/erster Zugang).

Erstellen Sie dann ein Deserializer für 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(); 
    } 
} 

Fügen Sie diese Konfiguration zu Ihrem Gson durch Retrofit verwendet:

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

Das ist es. Viel Glück.

+0

@here check this out, warum diese Antwort scheint besser: https://hackernoon.com/realmlist-realmstring-is-an-anti-pattern-bfc10efb7ca5#.8shy7ljzm offtopic: gepflückt Ihre Lösung – guness