新しい Android アプリケーションに RoboSpice を使い始めました。RoboSpice を ORMLite および SpringAndroidSpiceService と共に使用して、REST Web サービスから JSON を読み取ります。
今のところ、次のことができました。
- カスタム SpiceService を作成する
- WS からデータを取得するためのリクエストをほとんど行わない
- ORMLite を使用してデータを DB に永続化する
... 「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 グループのトピックを読みました。
RoboSpice キャッシングは透過的であることを意図しており、SpiceService に完全にカプセル化されていることに注意してください。キャッシュシステム(あなたの場合はデータベース)への共有参照(サービスとアクティビティによって共有)を介して直接キャッシュシステムにアクセスできるはずです。また、その場合、同時アクセスやデータベースの不整合などの副作用を防ぐことはできません。
それで、どうやって?私は完全に迷っています:(
編集 03/01: RoboSpice と ORMLite の能力が不足しているため、そのようなソリューションを実装する方法や自分で (少なくとも効率的に) 行う方法について混乱しています。RoboSpiceDatabaseHelper、InDatabaseObjectPersister、InDatabaseObjectPersisterFactory の使用/結合方法がわかりません...
質問2:
私の最後の質問は、データ アクセスとは関係ありません (このトピックを使用して質問します)。
getSpiceManager().execute(barsRequest, new Integer(1), DurationInMillis.ONE_HOUR, null)
(RequestListener へのコールバックなしで) 何もしないのはなぜですか? 実際、私の場合 (スプラッシュ スクリーン)、コールバックは必要ありません。避けることはできますか?
ありがとう!