2015-01-24 5 views
9

वहाँ एक पूर्णांक [] और एक String [], एक नया उद्देश्य यह है कि उन लोगों के शामिल बनाने, और फिर एक realmListएंड्रॉयड क्षेत्र [] और पूर्णांक भंडारण String []

में भंडारण के अलावा अन्य स्टोर करने के लिए एक रास्ता है मेरे पास एक ऑब्जेक्ट है जो स्ट्रिंग, int [], और स्ट्रिंग [] के पैरामीटर लेता है। आप नहीं कर सकते दुकान पूर्णांक [], और String [] दायरे में तो मैं एक वस्तु

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

+0

हमें अधिक जानकारी की आवश्यकता है – Coffee

+0

अधिक जानकारी – Brady131313

+0

धन्यवाद !!!!!!!! – Coffee

उत्तर

8

इमानुएल के द्वारा इन स्टोर कर सकते हैं है सोच रहा हूँ। अभी स्ट्रिंग या int लपेटने के अलावा कोई अन्य तरीका नहीं है और उन पर RealmList का उपयोग करें। यह विभिन्न प्लेटफार्मों पर रियलम फ़ाइल का उपयोग करने में सक्षम होने सहित कई कारणों से है। क्या यह आपके उपयोग-मामले में स्वीकार्य समाधान है या क्या यह दर्द है?

यदि आप चाहें, तो यह संकेत दर्शाता है कि कोई RealmObject के भीतर आदिम मूल्यों के समूह को संग्रहीत करने के लिए रीयलमिस्ट का उपयोग कैसे करेगा। https://gist.github.com/cmelchior/1a97377df0c49cd4fca9

+0

यह चीजों को और अधिक कठिन बनाता है, क्योंकि मुझे ऑब्जेक्ट्स बनाना और पैरामीटर बदलना है जो गतिशील रूप से मेरे सरणी – Brady131313

+0

में सामान जोड़ने के लिए बहुत कठिन बनाता है, और मैं अपने डिवाइस से क्षेत्र में देखने के लिए .realm फ़ाइल को कैसे खींच सकता हूं ब्राउज़र – Brady131313

+0

डिफ़ॉल्ट दायरे फ़ाइल 'context.getFilesDir()' द्वारा निर्दिष्ट निर्देशिका में स्थित है। जब तक आप एमुलेटर (या रूट डिवाइस) का उपयोग नहीं करते हैं, तो आप अनुमतियों के कारण इस फ़ाइल को फ़ोन से नहीं खींच सकते हैं, लेकिन यदि आप चाहें तो रीयलम फ़ाइल को बाहरी स्टोरेज में स्टोर कर सकते हैं, और उस बिंदु पर यह पहुंच योग्य है। – Emanuelez

3

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

बनाएं आप पुराना वापस के साथ दायरे का उपयोग कर रहे हैं तो आपके पुराना वापस बिल्डर वर्ग निम्न पंक्तियां जोड़ें

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 (नया RealmString (stringElement.getAsString())); उद्धारकर्ता – rookieDeveloper

+0

था, मैंने रेट्रोफिट प्रारंभिकरण पर अनुकूलित जीएसओएन ऑब्जेक्ट को याद किया है, जब तक कि मैं कॉल पर ऑनफेलर() पर हर बार उतरता हूं ... अब मैं कर सकता हूं रिस्पॉन्स() पर पहुंचें! आपने मेरी बहुत मदद की है! :) – Geryson

1

मुझे RealmString और RealmInt का उपयोग करना पसंद नहीं है। जब सूची बदलती है तो उदाहरण के लिए आप उन्हें फिर से हटाने का ट्रैक कैसे रखेंगे?

मैंने दायरे - जीएसओएन (रेट्रोफिट) कोम्बी के लिए एक कस्टम समाधान बनाया है, जहां वे एक ही मॉडल ऑब्जेक्ट साझा करते हैं। मैंने केवल 10 जेसन फाइलों का परीक्षण किया। अगर आपको कोई समस्या आती है तो मुझे बताएं और मैं इसे पूर्णता दूंगा।

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

फिर getters और setters इसके लिए बनाने के लिए:

सबसे पहले, एक पूर्णांक [] या String [] अपने RealmObject में के बजाय एक स्ट्रिंग पैदा करते हैं। ध्यान दें कि 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/रेट्रोफिट के लिए एक deserializer बनाएँ:

/** 
* 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 रेट्रोफिट द्वारा इस्तेमाल किया विन्यास को यह करें:

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

यह है कि। सौभाग्य।

+0

इस की जाँच @here, क्यों इस उत्तर बेहतर लगता है: https://hackernoon.com/realmlist-realmstring-is-an-anti-pattern-bfc10efb7ca5#.8shy7ljzm से Offtopic: अपने समाधान उठाया – guness

संबंधित मुद्दे