2014-10-01 2 views
5

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

Я прочитал документацию Sugar ORM и сделал именно то, что там написано. My 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 

Кроме того, я решил посмотреть на теге сахара ОРМ здесь StackOverflow, но нет ответов или вопросы могут дать мне подсказку о том, как решить эту проблему. Я новичок в экосистеме Android и буду любить любую помощь из вас, ребята, чтобы решить эту проблему. Заранее спасибо

ответ

7

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

Использование Sugar ОРМА вы не должны набора свойства идентификатора, как это относится к классу 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 

} 

Ура!

+1

Вы правы. Я решил эту проблему некоторое время назад, но забыл добавить решение этой темы. Вот сайт проблемы на github SugarORM: https://github.com/satyan/sugar/issues/171 – Superbyte

+0

Итак, мы не можем самостоятельно управлять идентификатором? –

+0

@DeanWild, к сожалению, нет. Поскольку у этого вопроса было более 2500 просмотров, я хотел рассказать вам, ребята, что я переключился с SQLite и SugarORM на [Realm.io] (https://realm.io/docs/java/latest/), и я должен сказать это был для меня очень хорошим выбором. Realm - это объектно-ориентированная база данных, и вы можете использовать ее для Android и iOS Development. – Superbyte

 Смежные вопросы

  • Нет связанных вопросов^_^