Я использую Robospice с моделями для модернизации и ORMLite. Модернизированная часть работает хорошо. У меня есть модель City переоборудования: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());
и слушатель:
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);
}
}
В это время я хочу, чтобы загрузить список города один раз с сервера и хранить этот список в sqlitedb модулем ORMLite. Я создал ORMLite модель:
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 выглядит следующим образом:
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;
}
}
Я не могу понять, как я могу хранить и читать данные из моего Город база данных? Как мне изменить RetrofitSpiceService? Я хочу загрузить данные по . Дооснащение и храните его в базе данных по ORMLite. Мой CacheManager правильно, то есть будет работать правильно? Может быть, я неправильно понимаю, как работает модуль Robospice-ORMLite?
Большое спасибо!
Это означает, что я могу использовать только кеш без sqlite? Я думаю, что это не сработает, когда пользователь снова закрывает и открывает приложение. В будущем я хочу получить временную метку, которая указывает, когда таблица City изменилась на сервере. Я проверю это время, и если он будет больше, чем моя временная метка в sqlite, я снова загружу данные с сервера. Можете ли вы привести пример, как использовать Retrofit & ormlite вместе? Сетевые запросы необходимы только в модуле «Дооснащение». – user3551221
1. Кэш Robospice использует ORMLite, когда вы передаете его в createCacheManager(). И данные будут по-прежнему находиться в кеше, если вы закроете приложение и снова откроете его. 2. Вам понадобится что-то вроде реализации с исправлением If-Modified-Since/Last-Modified. Поэтому, если данные не были изменены, сервер возвращает 304. . Пожалуйста, взгляните на документацию Robospice, в которой много вопросов, как это работает. –