2014-10-01 10 views
5

मैं वर्तमान में अपने एंड्रॉइड एप्लिकेशन के लिए Sugar ORM और Android Async Http Client का उपयोग कर रहा हूं।चीनी ओआरएम डेटाबेस में डेटा को सहेज नहीं रहा है

मैंने शुगर ओआरएम के दस्तावेज़ीकरण के माध्यम से पढ़ा और वास्तव में वहां क्या लिखा है। मेरा एचटीपी क्लाइंट सिंगलटन पैटर्न का उपयोग कर रहा है और कुछ एपीआई को कॉल करने के तरीकों को प्रदान करता है।

अब इसके बारे में बुरा हिस्सा आता है। मैं अपने डेटाबेस में लगातार डेटा को सहेजने में सक्षम नहीं हूं जो चीनी ओआरएम द्वारा बनाया गया है। यहाँ विधि है, कि एक API बुला रहा है:

D/Sugar: Fetching properties 
I/Sugar: Markets saved : 3 
I/Sugar: Markets saved : 5 
I/RestClient: The market database list has the size of:0 

इसके अलावा, मैं stackoverflow पर यहां चीनी ORM टैग पर एक दृष्टि डाली, लेकिन कोई जवाब:

public void getAvailableMarkets(final Context context, final MarketAdapter adapter) { 
     String url = BASE_URL.concat("/markets.json"); 
     client.addHeader("Content-Type", "application/json"); 
     client.addHeader("Accept", "application/json"); 

     client.get(context, url, null, new JsonHttpResponseHandler() { 

      @Override 
      public void onSuccess(int statusCode, Header[] headers, JSONArray response) { 

       Log.i(TAG, "Fetched available markets from server: " + response.toString()); 


       Result<Markets> productResult = new Result<Markets>(); 
       productResult.setResults(new Gson().<ArrayList<Markets>>fromJson(response.toString(), 
         new TypeToken<ArrayList<Markets>>() { 
         }.getType())); 
       ArrayList<Markets> marketsArrayList = productResult.getResults(); 

       // This lines tells me that there are no entries in the database 
       List<Markets> marketsInDb = Markets.listAll(Markets.class); 

       if(marketsInDb.size() < marketsArrayList.size() || 
         marketsInDb.size() > marketsArrayList.size()) { 

        Markets.deleteAll(Markets.class); 

        for(Markets m : marketsArrayList) { 
         Markets market = new Markets(m.getId(), m.getName(), m.getChainId(), m.getLat(), 
           m.getLng(), m.getBusinessHourId(), m.getCountry(), m.getZip(), m.getCity(), 
           m.getStreet(), m.getPhoto(), m.getIcon(), m.getUrl()); 

         market.save(); 

         adapter.add(market); 
        } 

        adapter.notifyDataSetChanged(); 

       } 

       List<Markets> market = Markets.listAll(Markets.class); 
       // This lines proves that Sugar ORM is not saving the entries 
       Log.i(TAG, "The market database list has the size of:" + market.size()); 
      } 
     }); 
    } 

यह वही है Logcat मुद्रण है या प्रश्न मुझे उस समस्या को हल करने के बारे में संकेत दे सकते हैं। मैं एंड्रॉइड पारिस्थितिकी तंत्र के लिए नौसिखिया हूं और इस समस्या को हल करने के लिए आप लोगों की किसी भी मदद से प्यार करूंगा। अग्रिम धन्यवाद

उत्तर

7

मैं इसे आपके जैसा ही हल करता हूं। यह गर्दन में दर्द था लेकिन कुछ घंटों के बाद मुझे पता चला कि इस समस्या के कारण क्या हुआ।

चीनी ORM का उपयोग करके आप नहीं करना चाहिए सेट आईडी संपत्ति के रूप में यह SugarRecord वर्ग, के अंतर्गत आता है अन्यथा ORM वस्तुओं को अद्यतन करने के बजाय उन्हें डालने की कोशिश करेंगे है। जैसा कि मुझे अपनी ऑब्जेक्ट आईडी के साथ फ़ील्ड रखना है, मैंने इसे किसी अन्य फ़ील्ड को असाइन करने के लिए जेसन एनोटेशन का उपयोग किया। अंतिम चरण जीएसओएन को एनोटेशन एक्सपोज़ किए बिना फ़ील्ड को बाहर करने के लिए कॉन्फ़िगर किया गया था।

तो मेरी कक्षा अब नीचे एक तरह लग रहा है:

public class MyClass 
{ 
    @Expose 
    @SerializedName("id") 
    private long myId; 
    @Expose 
    private String field1; 
    @Expose 
    private String field2; 
    @Expose 
    private byte[] field3; 
    @Expose 
    private double field4; 

    public MyClass() { } 

    // parametrized constructor and more logic 

} 

चीयर्स!

+1

आप सही हैं। मैंने थोड़ी देर पहले इस मुद्दे को हल किया लेकिन इस धागे के समाधान को जोड़ना भूल गया। शुगरोरम के जिथब पर समस्या साइट है: https://github.com/satyan/sugar/issues/171 – Superbyte

+0

तो हम आईडी को स्वयं नियंत्रित नहीं कर सकते हैं? दुर्भाग्य से –

+0

@DeanWild नहीं। चूंकि इस प्रश्न में 2500 से अधिक दृश्य हैं, मैं आपको लोगों को बताना चाहता था कि मैंने SQLite और SugarORM से [Realm.io] (https://realm.io/docs/java/latest/) पर स्विच किया है और मुझे यह कहना है मेरे लिए बहुत अच्छा विकल्प रहा है। दायरे एक ऑब्जेक्ट उन्मुख डेटाबेस है और आप इसे एंड्रॉइड और आईओएस विकास के लिए भी उपयोग कर सकते हैं। – Superbyte

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