4

新しい 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 へのコールバックなしで) 何もしないのはなぜですか? 実際、私の場合 (スプラッシュ スクリーン)、コールバックは必要ありません。避けることはできますか?


ありがとう!

4

1 に答える 1