2013-12-02 1 views
3

Привет, мы используем RoboSpice с ORMLite и SpringAndroidSpiceRequest для чтения Информация JSON с веб-страницы и запись в базу данных SQLite.Не удается сохранить вложенные части запроса JSON с использованием robospice и ormlite

Мы используем новейший преобразователь JSON MappingJackson2HttpMessageConverter.

 // Web services support JSON responses 
     MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter(); 
     FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter(); 
     StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(); 
     final List<HttpMessageConverter<?>> listHttpMessageConverters = restTemplate.getMessageConverters(); 

Мы пытались читать вложенные запросы JSON, как на примере ниже, мы можем прочитать и хранить в базе данных, первый уровень JSON (страницы, общий), но мы не можем хранить следующий Левет массива JSON, все записи «schedule_date».

Мы рассмотрели этот пример (и многие другие) как лучший пример для хранения данных JSON . Но это не работает для нас. RoboSpice persist JSON array with OrmLite

Вопрос: Как мы можем читать и писать вложенные ключи и значения JSON, We в тупике! : O

JSON:

{ 
    "page": 2, 
    "total": 5, 
    "result": 
    [ 
     { 
      "schedule_date": "2013-08-03" 
     }, 
     { 
      "schedule_date": "2013-09-03" 
     }, 
     { 
      "schedule_date": "2013-10-03" 
     }, 
     { 
      "schedule_date": "2013-11-03" 
     }, 
     { 
      "schedule_date": "2013-12-03" 
     } 
    ] 
} 

BroadcastResult.java:

  import java.util.Collection; 
      import java.util.List; 
      import com.j256.ormlite.field.DatabaseField; 
      import com.j256.ormlite.table.DatabaseTable; 
      import com.j256.ormlite.field.ForeignCollectionField; 
      import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 

      @JsonIgnoreProperties(ignoreUnknown = true) 
      @DatabaseTable(tableName="BroadcastResult") 
      public class BroadcastResult { 

       @DatabaseField(id = true) 
       private int page; 

       @DatabaseField 
       private int total; 

       @ForeignCollectionField(eager = false) 
       private Collection<Broadcast> result; 

       public int getPage() { 
        return page; 
       } 

       public void setPage(int page) { 
        this.page = page; 
       } 

       public int getTotal() { 
        return total; 
       } 

       public void setTotal(int total) { 
        this.total = total; 
       } 

       public Collection<Broadcast> getResult() { 
        return result; 
       } 

       public void setResult(Collection<Broadcast> result) { 
        this.result = result; 
       } 
      } 

Broadcast.java:

  import com.j256.ormlite.field.DatabaseField; 
      import com.j256.ormlite.table.DatabaseTable; 
      import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 

      @JsonIgnoreProperties(ignoreUnknown = true) 
      @DatabaseTable(tableName="Broadcast") 
      public class Broadcast { 

       @DatabaseField(id = true) 
       private String schedule_date; 

       @DatabaseField(foreign = true) 
       private BroadcastResult result; 

       public String getScheduleDate() { 
        return schedule_date; 
       } 

       public void setScheduleDate(String schedule_date) { 
        this.schedule_date = schedule_date; 
       } 

       public void setBroadcastResult(BroadcastResult result) { 
        this.result = result; 
       } 

       public BroadcastResult getBroadcastResult() { 
        return result; 
       } 
      } 

Мы получили эта ошибка, которую мы не понимаем.
Logcat: SQLiteLog (10637): (1) нет такой колонки: result_id

@DatabaseField(foreign = true) // also tried (foreign = true, ColumnName="result") 
private BroadcastResult result; 

Полного журнал для тестирования разбега можно увидеть здесь: https://gist.github.com/anonymous/7760344

+1

Джексон сложный, я считаю, что имена полей строятся не из частных имен переменных, а из сеттеров и геттеров. – portforwardpodcast

ответ

0

Вы пытались добавить

@DatabaseField(generatedId = true) 
private int _id; 

для вашего класса Broadcast.java?