2016-03-24 2 views
0

Для вложенных объектов JSON какОбъединения Дооснащения 2 с Greendao сущностями

{"members": [ 
    { 
     "id":366, 
     "code":"T1234", 
     "defaultAddress": { 
      "addressLine1": "A2 Rityayan co-operative Housing Society" 
      "addressLine2": "P-34 Moti jheel avenue Dumdum" 
     } 
    } 
]} 

Я сделал следующие объекты в Greendao,

private static void addMember(Schema schema) { 
    Entity member = schema.addEntity("CareMember"); 

    Property memberId = member.addLongProperty("id").primaryKey().getProperty(); 
    member.addStringProperty("code").unique(); 

    Entity defaultAddress = schema.addEntity("DefaultAddress"); 
    defaultAddress.addIdProperty(); 
    defaultAddress.addStringProperty("addressLine1"); 
    defaultAddress.addStringProperty("addressLine2"); 
    member.addToOne(defaultAddress, memberId); 
    defaultAddress.implementsSerializable();  
} 

Я хочу создать один на один отношения с и сохранить модели в базе данных Хотя элемент сохранен, трудно сохранить адрес по умолчанию и восстановить его. Я разработал некоторое обходное решение, но надеюсь, что для этого есть правильный путь. Любая помощь была бы оценена

ответ

0

Я нашел способ, используя джексон вместо gson в модификации. Для этого добавьте следующий код в Gradle

compile 'com.squareup.retrofit2:converter-jackson:2.0.0' 
compile 'org.codehaus.jackson:jackson-core-asl:1.1.0' 

Тогда в классе остальных служб,

public class RestService{ 
RestInterface restInterface; 
public RestService(Context context) { 
     this.context = context; 
     OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder(); 


     okHttpClient = clientBuilder.build(); 

     ObjectMapper objectMapper = new ObjectMapper(); 
     objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
     restServiceInterface = new Retrofit.Builder() //restServiceInterface //is the the rest service Interface variable 
       .baseUrl(RestInterface.BASE_URL) 
       .client(okHttpClient) 
       .addConverterFactory(JacksonConverterFactory.create(objectMapper)) 

       .build() 
       .create(RestServiceInterface.class); 
    } 

} 

Поскольку джексон использует методу сеттера, следовательно, изменить метод сеттер defaultAddress в классе CareMember

// KEEP METHODS - put your custom methods here 
    @JsonSetter(value = "defaultAddress") 
    public void setDefaultAddressFromRetrofit(DefaultAddress defaultAddress) { 
     if (defaultAddress == null) { 
      throw new DaoException("To-one property 'defaultAddressId' has not-null constraint; cannot set to-one to null"); 
      defaultAddress = new DefaultAddress(); 
     } 

     synchronized (this) { 
      this.defaultAddress = defaultAddress; 
      defaultAddress.setId(id); 
      defaultAddress__resolvedKey = id; 
     } 

    } 
// KEEP METHODS END 

Наконец, в вашем пользовательском классе вспомогательных классов Sql (откуда вы храните или извлекаете)

public class DaoHelper{ 
public void addCareMember(CareMember entity){ 
     SQLiteDatabase db = application.getDatabase(true);//application->instance of Application 
     DaoMaster daoMaster = new DaoMaster(db); 
     DaoSession session = daoMaster.newSession(); 

      daoSession.getDefaultAddressDao().insertOrReplace(entity.getDefaultAddress()); 


     daoSession.getCareMemberDao().insertOrReplace(entity); 
    } 

public CareMember getCareMemberByCode(String code) { 
     SQLiteDatabase db = application.getDatabase(false); 

     CareMember member = (new DaoMaster(db)).newSession().getCareMemberDao() 
       .queryRaw("WHERE " + CareMemberDao.Properties.Code.name + "=?", code).get(0); 
     member.setDefaultAddress(member.getDefaultAddress()); 
     member.setContacts(member.getContacts());//this is done here because //the daoSession has to be alive to retrieve from one-many relation 
     return member; 
    } 
} 
+0

Не могли бы вы рассказать мне, как это можно сделать с помощью greendao 3.0.1 – neena

+0

Извините, я закончил с GreenDao и использовал DbFlow. Но если я собираюсь изучить это, я отправлю его здесь. – Debanjan