2014-09-29 4 views
2

Я использую 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?

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

ответ

1

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

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

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

+0

Это означает, что я могу использовать только кеш без sqlite? Я думаю, что это не сработает, когда пользователь снова закрывает и открывает приложение. В будущем я хочу получить временную метку, которая указывает, когда таблица City изменилась на сервере. Я проверю это время, и если он будет больше, чем моя временная метка в sqlite, я снова загружу данные с сервера. Можете ли вы привести пример, как использовать Retrofit & ormlite вместе? Сетевые запросы необходимы только в модуле «Дооснащение». – user3551221

+0

1. Кэш Robospice использует ORMLite, когда вы передаете его в createCacheManager(). И данные будут по-прежнему находиться в кеше, если вы закроете приложение и снова откроете его. 2. Вам понадобится что-то вроде реализации с исправлением If-Modified-Since/Last-Modified. Поэтому, если данные не были изменены, сервер возвращает 304. . Пожалуйста, взгляните на документацию Robospice, в которой много вопросов, как это работает. –

 Смежные вопросы

  • Нет связанных вопросов^_^