Sugar ORM не сохраняет данные в базу данных

В настоящее время я использую Sugar ORM и Android Async Http Client для моего приложения Android.

Я прочитал документацию Sugar ORM и сделал именно то, что там написано. Мой HttpClient использует шаблон singleton и предоставляет методы для вызова некоторых API.

А теперь самое плохое. Я не могу постоянно сохранять данные в своей базе данных, созданной Sugar ORM. Вот метод, который вызывает 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());
            }
        });
    }

Вот что печатает Logcat:

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

Также я взглянул на тег Sugar ORM здесь, в stackoverflow, но никакие ответы или вопросы не могли дать мне подсказку о том, как решить эту проблему. Я новичок в экосистеме Android и буду рад любой помощи от вас, ребята, чтобы решить эту проблему. заранее спасибо


person Mehrad Rafigh    schedule 01.10.2014    source источник


Ответы (1)


Я просто решаю ту же проблему, что и у вас. Это была боль в шее, но через несколько часов я узнаю, что вызвало эту проблему.

Используя Sugar ORM, вы не должны устанавливать свойство id, так как оно принадлежит классу SugarRecord, иначе ORM попытается обновить объекты вместо их вставки. Поскольку мне нужно иметь поле с идентификатором моего объекта, я использовал аннотацию json, чтобы назначить его другому полю. Последним шагом была настройка GSON для исключения полей без аннотации Expose.

Итак, мой класс выглядит следующим образом:

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  

}

Ваше здоровье!

person Yorgi    schedule 02.12.2014
comment
Ты прав. Я решил эту проблему некоторое время назад, но забыл добавить решение в эту тему. Вот сайт проблемы на github SugarORM: github.com/satyan/sugar/issues/171< /а> - person Mehrad Rafigh; 03.12.2014
comment
Значит, мы не можем контролировать id сами? - person Dean Wild; 21.04.2015
comment
@DeanWild, к сожалению, нет. Поскольку у этого вопроса более 2500 просмотров, я хотел бы сказать вам, ребята, что я перешел с SQLite и SugarORM на Realm.io, и я должен сказать, что это был очень хороший выбор для меня. Realm — это объектно-ориентированная база данных, и вы также можете использовать ее для разработки Android и iOS. - person Mehrad Rafigh; 15.07.2015
comment
Ха-ха, я перешел из Realm в SugarORM! Сначала я был очень доволен Realm (особенно производительностью), но после того, как у меня возникли проблемы с его правилами потоковой передачи. Если вы извлекаете объект, используя область в одном потоке, а затем пытаетесь получить доступ к этому объекту из другого потока, это не сработает. Это быстро стало для меня большой проблемой. Например, это не позволяет мне писать традиционный уровень базы данных. - person Dean Wild; 15.07.2015
comment
Я полностью согласен с вами, что запрос и доступ к объектам из Realm — это проблема, но похоже, что основные разработчики Realm работают над этим. Взгляните сюда: github.com/realm/realm-java/issues/1208 - person Mehrad Rafigh; 17.07.2015