Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sugar ORM is not saving data into the database

I am currently using Sugar ORM and Android Async Http Client for my Android application.

I read through the documentation of Sugar ORM and did exactly what is written there. My HttpClient is using the singleton pattern and provides methods for calling some APIs.

Now comes the bad part about it. I am not able to save the data persistently into my database which is created by Sugar ORM. Here is the method, that is calling an API:

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

This is what Logcat is printing:

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

Also I took a look at the Sugar ORM tag here at stackoverflow, but no answers or questions could give me a hint on how to solve that problem. I am a newbie to the android ecosystem and would love any help of you guys to solve this problem. Thanks in advance

like image 539
Mehrad Rafigh Avatar asked Oct 01 '14 21:10

Mehrad Rafigh


1 Answers

I just solve it the same problem as you have. It was a pain in the neck but after few hours I find out what caused this problem.

Using Sugar ORM you must not set id property as it's belongs to SugarRecord class, otherwise ORM will try to update objects instead of insert them. As I need to have field with my object id, I used json annotation to assign it to another field. Last step was configure GSON to exclude fields without Expose annotation.

So my class looks like one below now:

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  

}

Cheers!

like image 125
Yorgi Avatar answered Nov 15 '22 00:11

Yorgi