Robospice + Retrofit + 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());

и слушатель:

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? Я хочу загрузить данные с помощью Retrofit и сохранить их в базе данных с помощью ORMLite. Мой CacheManager правильный, т.е. будет работать правильно? Может быть, я неправильно понимаю, как работает модуль Robospice-ORMLite?

Большое спасибо!

1 ответ

Решение

Когда вы выполняете вызов execute() с ключом и продолжительностью кэша, Robospice сохранит ваш ответ в базе данных.

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

Все последующие запросы в течение одной минуты получат данные из этого кэша, а затем сделают сетевой вызов. Если вы хотите получать данные только из кэша, взгляните на метод getSpiceManager(). GetFromCache(). Я думаю, это то, что вы ищете.

Другие вопросы по тегам