2014-09-29 7 views
2

나는 RobOSice를 개장 및 ORMLite 모듈과 함께 사용하고 있습니다. 개량 된 부분이 잘 작동합니다.Robospice + Retrofit + ORMLite

City.java : 나는 개조를위한 도시 모델을

public class City { 
    public int city_id; 
    public String name; 

    @SuppressWarnings("serial") 
    public static class List extends ArrayList<City> { 
    } 
} 

내가 GET 요청에 의해 서버에서이 모델을 복용 해요 :

MyApi.java

public interface MyAPI { 
    @GET("/cities") 
    City.List getCities(); 
} 

이 부분은 다음과 같은 방법으로 정상적으로 작동합니다.

getSpiceManager().execute(mRequestCity, "city", DurationInMillis.ONE_MINUTE, new ListCityRequestListener()); 

와 청취자 : 전 서버에서 한 번 도시 목록을 다운로드하고 ORMLite 모듈 sqlitedb에이 목록을 저장할 이때

public final class ListCityRequestListener implements RequestListener<City.List> { 

    @Override 
    public void onRequestFailure(SpiceException spiceException) { 
     Toast.makeText(RegisterActivity.this, "failure", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onRequestSuccess(final City.List result) { 
     Toast.makeText(RegisterActivity.this, "success", Toast.LENGTH_SHORT).show(); 
     updateCities(result); 
    } 
} 

. 내가 만든 ORMLite 모델 :

public class RetrofitSpiceService extends RetrofitGsonSpiceService { 

    private final static String BASE_URL = "http://example.com/api/v1"; 
    private final static UserFunctions userFunctions = new UserFunctions(); 

    @Override 
    public CacheManager createCacheManager(Application application) throws CacheCreationException { 
     CacheManager cacheManager = new CacheManager(); 
     List< Class<?>> classCollection = new ArrayList< Class<?>>(); 

     // add persisted classes to class collection 
     classCollection.add(City.class); 

     // init 
     RoboSpiceDatabaseHelper databaseHelper = new RoboSpiceDatabaseHelper(application, "sample_database.db", 1); 
     InDatabaseObjectPersisterFactory inDatabaseObjectPersisterFactory = new InDatabaseObjectPersisterFactory(application, databaseHelper, classCollection); 
     cacheManager.addPersister(inDatabaseObjectPersisterFactory); 

     return cacheManager; 
    } 

    @Override 
    protected Builder createRestAdapterBuilder() { 
     Builder mBuilder = super.createRestAdapterBuilder(); 

     mBuilder.setRequestInterceptor(new RequestInterceptor() { 
      @Override 
      public void intercept(RequestFacade request) { 
       if (userFunctions.isUserLoggedIn()) { 
        request.addHeader("Authorization", userFunctions.getToken()); 
       } 
      } 
     }); 

     return mBuilder; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     addRetrofitInterface(MyAPI.class); 
    } 

    @Override 
    protected String getServerUrl() { 
     return BASE_URL; 
    } 
} 

내가 저장할 수있는 방법을 이해 할 수없고 :

City.java는

@DatabaseTable(tableName = "city") 
public class City { 
    public final static String DB_CITY_ID_FIELD_NAME = "id"; 
    public final static String DB_CITY_NAME_FIELD_NAME = "name"; 

    @DatabaseField(canBeNull = false, dataType = DataType.INTEGER, columnName = DB_CITY_ID_FIELD_NAME) 
    int id; 

    @DatabaseField(canBeNull = false, dataType = DataType.STRING, columnName = DB_CITY_NAME_FIELD_NAME) 
    private String name; 

    public City() { 

    } 

    @Override 
    public String toString() { 
     StringBuilder sb = new StringBuilder(); 

     sb.append("id = ").append(id); 
     sb.append(", ").append("name = ").append(name); 

     return sb.toString(); 
    } 
} 

RetrofitSpiceService.java은 다음과 같습니다 내 데이터베이스에서 데이터를 읽으시겠습니까? RetrofitSpiceService를 어떻게 변경해야합니까? 에 의해 데이터를 다운로드하고ORMLite에 의해 데이터베이스에 저장하십시오. 내 CacheManager가 올바른지, 즉 올바르게 작동합니까? 어쩌면 내가 모듈 Robospice-ORMLite이 어떻게 작동하는지 오해한다.

고맙습니다.

답변

1

캐시 키와 기간이있는 execute() 호출을하면 Robospice는 응답을 데이터베이스에 저장합니다.

getSpiceManager().execute(mRequestCity, "city", DurationInMillis.ONE_MINUTE, new ListCityRequestListener()); 

1 분 동안 다음 요청이 있으면이 캐시에서 데이터를 가져 와서 네트워크 호출을합니다. 캐시에서만 데이터를 가져 오려면 getSpiceManager().getFromCache() 메소드를 살펴보십시오. 나는 그것이 당신이 찾고있는 것이라고 생각합니다.

+0

즉, sqlite없이 캐시 만 사용할 수 있다는 의미입니까? 사용자가 앱을 닫고 다시 열면이 기능이 작동하지 않는다고 생각합니다. 앞으로 도시 테이블이 서버에서 변경되었을 때를 나타내는 타임 스탬프를 얻고 싶습니다. 이 시간을 확인하고 sqlite의 타임 스탬프보다 크면 서버에서 데이터를 다시 다운로드합니다. Retrofit & ormlite를 함께 사용하는 방법을 보여줄 수 있습니까? Retrofit 모듈에서만 네트워크 요청이 필요합니다. – user3551221

+0

1. Robospice의 캐시는 createCacheManager()에 전달할 때 ORMLite를 사용합니다. 응용 프로그램을 강제 종료하고 다시 열면 데이터가 여전히 캐시에 저장됩니다. 2. If-Modified-Since/Last-Modified 캐시 구현과 같은 것이 필요합니다. 따라서 데이터가 수정되지 않은 경우 서버는 304를 반환합니다. Robospice 설명서에서 작동 방법에 대해 많은 것을 다루고 있습니다. –