我刚开始将 RoboSpice 用于一个新的 Android 应用程序。RoboSpice 与 ORMLite 和 SpringAndroidSpiceService 一起用于从 REST Web 服务读取 JSON。
目前,我设法:
- 创建自定义 SpiceService
- 很少请求从 WS 获取数据
- 使用 ORMLite 将数据持久化到数据库
...感谢“robospice-sample-ormlite”样本。
我的应用程序的主要部分(底部的问题):
基本活动
public abstract class BaseActivity extends RoboActivity {
private SpiceManager spiceManager = new SpiceManager(MySpiceService.class);
@Override
protected void onStart() {
super.onStart();
spiceManager.start(this);
}
@Override
protected void onStop() {
if (spiceManager.isStarted()) {
spiceManager.shouldStop();
}
super.onStop();
}
protected SpiceManager getSpiceManager() {
return spiceManager;
}
}
飞溅活动
public class SplashActivity extends BaseActivity {
...
@Override
protected void onStart() {
super.onStart();
...
getSpiceManager().execute(foosRequest, new Integer(0), DurationInMillis.ONE_HOUR, new FoosRequestListener());
getSpiceManager().execute(barsRequest, new Integer(1), DurationInMillis.ONE_HOUR, new BarsRequestListener());
// Start MainActivity after X seconds (handler + startActivity(intent...)
...
}
public final class FoosRequestListener implements RequestListener<Foos> {
@Override
public void onRequestFailure(SpiceException spiceException) {
Toast.makeText(MainActivity.this, "failure foo", Toast.LENGTH_SHORT).show();
}
@Override
public void onRequestSuccess(final Days result) {
Toast.makeText(MainActivity.this, "success foo", Toast.LENGTH_SHORT).show();
String originalText = getString(R.string.textview_text);
mLoremTextView.setText(originalText + result.getResult().iterator().next().getMoonrise());
}
}
public final class BarsRequestListener implements RequestListener<Bars> {
@Override
public void onRequestFailure(SpiceException spiceException) {
Toast.makeText(MainActivity.this, "failure bars", Toast.LENGTH_SHOR ).show();
}
@Override
public void onRequestSuccess(final Months result) {
Toast.makeText(MainActivity.this, "success bars", Toast.LENGTH_SHORT).show();
}
}
}
我的香料服务
public class MySpiceService extends SpringAndroidSpiceService {
...
@Override
public CacheManager createCacheManager(Application application) throws CacheCreationException {
CacheManager cacheManager = new CacheManager();
List<Class<?>> classCollection = new ArrayList< Class< ? >>();
// Add persisted classe(s) to class collection
classCollection.add(Foos.class); // Collection of "Foo"
classCollection.add(Foo.class);
classCollection.add(Bars.class); // Collection of "Bars"
classCollection.add(Bar.class);
// Init
RoboSpiceDatabaseHelper databaseHelper = new RoboSpiceDatabaseHelper(application, DATABASE_NAME, DATABASE_VERSION);
InDatabaseObjectPersisterFactory inDatabaseObjectPersisterFactory = new InDatabaseObjectPersisterFactory(application, databaseHelper, classCollection);
cacheManager.addPersister(inDatabaseObjectPersisterFactory);
return cacheManager;
}
@Override
public RestTemplate createRestTemplate() {
...
return restTemplate;
}
}
该应用程序由启动画面(SplashActivity)和其他活动组成。启动画面会在几秒钟后启动 MainActivity(暂时只是一个计时器)。
我想做的是从启动屏幕下载所有数据(RoboSpice 已经将这些数据缓存/保存在 SQLite DB 中),然后从其他活动中访问它。
问题1: 是否可以在SplashActivity之外访问和操作数据库数据?如何(你能提供一些代码示例)?
关于“RoboSpiceDataBaseHelper”的 Wiki 页面对我来说不是很清楚:据说“RoboSpiceDataBaseHelper 用于管理数据库创建和版本管理”,但在下一段中指出某些方法允许“从数据库中查询和检索数据” ”。在 RoboSpice 示例中,没有关于从其他活动中检索数据的内容。如何利用 ORMLite 的力量?
我从 Snicolas阅读了这个 Google Groups 主题:
请注意,RoboSpice 缓存是透明的,并且完全封装在 SpiceService 中。应该可以通过对缓存系统的共享引用(由服务和您的活动共享)直接访问缓存系统(在您的情况下为数据库)。此外,在这种情况下,没有什么可以防止并发访问或数据库不一致等副作用。
又怎样?我完全迷路了:(
编辑 03/01:由于我缺乏对 RoboSpice 和 ORMLite 的能力,我很困惑如何实施这样的解决方案/自己(至少有效地)这样做。我看不到如何使用/组合 RoboSpiceDatabaseHelper、InDatabaseObjectPersister、InDatabaseObjectPersisterFactory...
问题2:
我的最后一个问题与数据访问无关(我拿这个话题来问)。
为什么getSpiceManager().execute(barsRequest, new Integer(1), DurationInMillis.ONE_HOUR, null)
什么都不做(不回调 RequestListener)?事实上,就我而言(启动画面),我不需要回调。我可以避免吗?
谢谢!