RoboSpice и ORMLite – доступ к данным

Я только начал использовать RoboSpice для нового приложения для Android. RoboSpice используется с ORMLite и SpringAndroidSpiceService для чтения JSON из веб-службы REST.

Пока мне удалось:

  • Создать собственный SpiceService
  • Сделать несколько запросов на получение данных из WS
  • Сохранять данные в DB с ORMLite

… благодаря образцу «robospice-sample-ormlite» .

Основные части моего приложения (вопросы внизу):

BaseActivity

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

SplashActivity

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

MySpiceService

 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? Как (можете ли вы привести примеры кода)?

Страница Wiki о «RoboSpiceDataBaseHelper» для меня не очень понятна: указано, что «RoboSpiceDataBaseHelper используется для управления созданием базы данных и управлением версиями», но в следующем абзаце сказано, что некоторый метод позволяет «запрашивать и извлекать данные из базы данных ». В образцах RoboSpice ничего не происходит из-за получения данных из других действий. Как использовать силу ORMLite?

Я прочитал из этой темы Группы Google от Snicolas:

Обратите внимание, что кеширование RoboSpice должно быть прозрачным и полностью инкапсулировано в SpiceService. Должно быть возможным получить доступ к системе кэширования (в вашем случае к базе данных) непосредственно через общую ссылку на нее (совместно используемую службой и вашими действиями). Кроме того, в этом случае ничто не предотвратит побочные эффекты, такие как параллельный доступ или несогласованность базы данных.

Так как? Я полностью потерян 🙁

Редактировать 03/01: Из-за моей недостаточной компетентности с RoboSpice и ORMLite я смущен, как реализовать такое решение / сделать это сам (по крайней мере эффективно). Я не вижу, как использовать / комбинировать RoboSpiceDatabaseHelper, InDatabaseObjectPersister, InDatabaseObjectPersisterFactory …


Вопрос 2:

Мой последний вопрос не связан с доступом к данным (я беру эту тему, чтобы спросить).

Почему getSpiceManager().execute(barsRequest, new Integer(1), DurationInMillis.ONE_HOUR, null) ничего не делает (без обратного вызова для RequestListener)? Infact, в моем случае (заставка), мне не нужен обратный вызов. Можно ли это избежать?


Благодаря!

Вопрос 1 :

Вам необходимо разделить RoboSpiceDatabaseHelper между вашим сервисом и местами, к которым вы хотите получить доступ.

Самый чистый способ – использовать инфраструктуру инъекций, такую ​​как RoboGuice. Быстрый и грязный взлом – создать статический провайдер для этого экземпляра, или даже более грязный и быстрый, сделать RoboSpiceDatabaseHelper .

—ОБНОВИТЬ

Когда вы используете RoboGuice, вы можете:

Создайте свой собственный класс RoboSpiceDatabaseHelper и аннотируйте его с помощью @Singleton:

 @Singleton public class MyRoboSpiceDatabaseHelper extends RoboSpiceDatabaseHelper { ... } 

Как в вашем spiceservice, так и в классах, которым необходим доступ к базе данных, вы можете объявить член как:

 @Inject RoboSpiceDatabaseHelper databaseHelper; 

Тогда вы получите правильный синглтон, позволяющий вам делиться доступом к базе данных.

Вопрос 2 :

Если вам действительно нужно идти быстро, просто создайте прослушиватель / заглушку. RS не будет выполнять запрос без прослушивателя.

Intereting Posts
Какое разрешение экрана я должен учитывать при разработке приложения для Android? Как проверить версию Google Play? Вложение Cordova WebView, приемник не зарегистрирован Анимация каждого элемента списка при отображении Android: многострочный текстовый просмотр в Tablerow по вертикали Закрытие операции и диалоговое окно на заднем пульте Использование иврита с эмулятором Android Показывать ход окна, но не ActionBar Progress (с использованием библиотеки совместимости v7) Как проверить, включена ли настройка экрана с автоматическим поворотом в Android 4.0+ Как создать список объектов в Java Как создать резервную копию / восстановление базы данных SQLite на Android в Dropbox Как прокручивать в нижней части списка ListView программно? TextViews сверху и снизу, оставшееся пространство, заполненное ListView Android Notification не показывает значок цвета в Marshmallow Слишком много шаблонов, как я могу уменьшить свои строители POJO?