【问题标题】:Robospice + Retrofit + ORMLiteRobospice + 改造 + ORMLite
【发布时间】:2014-09-29 18:28:15
【问题描述】:

我正在使用带有 Retrofit 和 ORMLite 模块的 Robospice。改造部分工作良好。我有用于改造的城市模型:

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

此时我想从服务器下载一次城市列表,并通过 ORMLite 模块将此列表存储到 sqlitedb 中。我已经创建了 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;
    }
}

我不明白如何从我的 City 数据库中存储和读取数据?我需要如何更改 RetrofitSpiceService?我想通过 Retrofit 下载数据并通过 ORMLite 将其存储到数据库中。我的 CacheManager 是正确的,即可以正常工作吗?也许我误解了模块 Robospice-ORMLite 的工作原理?

非常感谢!

【问题讨论】:

    标签: java android ormlite retrofit robospice


    【解决方案1】:

    当您使用缓存键和持续时间进行 execute() 调用时,Robospice 会将您的响应存储到数据库中。

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

    一分钟内所有后续请求都会从这个缓存中获取数据,然后进行网络调用。如果您只想从缓存中获取数据,请查看getSpiceManager().getFromCache() 方法。我想这就是你要找的东西。

    【讨论】:

    • 意思是只能用缓存,不能用sqlite?我认为当用户关闭并再次打开应用程序时,这将不起作用。将来我想获得指示服务器上城市表何时更改的时间戳。我会检查这个时间,如果它大于我在 sqlite 中的时间戳,我将再次从服务器下载数据。你能举一些例子如何一起使用Retrofit和ormlite吗?仅在 Retrofit 模块中需要网络请求。
    • 1.当您在 createCacheManager() 中传递时,Robospice 的缓存使用 ORMLite。如果您强制关闭应用程序并再次打开它,数据仍将在缓存中。 2. 你需要类似 If-Modified-Since/Last-Modified 缓存实现。因此,如果数据未修改,服务器返回 304。请查看 Robospice 文档,它涵盖了很多问题,它是如何工作的。
    猜你喜欢
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多