Search code examples
javaandroidormliteretrofitrobospice

Robospice + Retrofit + ORMLite


I'm using Robospice with Retrofit ans ORMLite modules. Retrofit part working good. I have City model for Retrofit:

City.java:

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

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

I'm taking this model from server by GET-request:

MyApi.java

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

This part works fine by calling this method:

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

and listener:

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);
    }
}

At this time i want to download city list once from server and store this list into sqlitedb by ORMLite module. I've created ORMLite model:

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();
    }
}

My RetrofitSpiceService.java looks like this:

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;
    }
}

I can't understand how can i store and read data from my City database? How do i need to change RetrofitSpiceService? I want download data by Retrofit and store it to database by ORMLite. My CacheManager is correct, i.e. will work properly? Maybe I misunderstand how the module Robospice-ORMLite works?

Thanks a lot!


Solution

  • When you make execute() call with cache key and duration Robospice will store your response into database.

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

    All following requests during one minute will get data from this cache, and then it makes network call. If you want to get data only from cache take a look on getSpiceManager().getFromCache() method. I think it's what you are looking for.