나는 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이 어떻게 작동하는지 오해한다.
고맙습니다.
즉, sqlite없이 캐시 만 사용할 수 있다는 의미입니까? 사용자가 앱을 닫고 다시 열면이 기능이 작동하지 않는다고 생각합니다. 앞으로 도시 테이블이 서버에서 변경되었을 때를 나타내는 타임 스탬프를 얻고 싶습니다. 이 시간을 확인하고 sqlite의 타임 스탬프보다 크면 서버에서 데이터를 다시 다운로드합니다. Retrofit & ormlite를 함께 사용하는 방법을 보여줄 수 있습니까? Retrofit 모듈에서만 네트워크 요청이 필요합니다. – user3551221
1. Robospice의 캐시는 createCacheManager()에 전달할 때 ORMLite를 사용합니다. 응용 프로그램을 강제 종료하고 다시 열면 데이터가 여전히 캐시에 저장됩니다. 2. If-Modified-Since/Last-Modified 캐시 구현과 같은 것이 필요합니다. 따라서 데이터가 수정되지 않은 경우 서버는 304를 반환합니다. Robospice 설명서에서 작동 방법에 대해 많은 것을 다루고 있습니다. –