RoboSpice y ORMLite – Acceso a los datos

Acabo de empezar a usar RoboSpice para una nueva aplicación de Android. RoboSpice se utiliza con ORMLite y SpringAndroidSpiceService para leer JSON desde un servicio Web REST.

Por ahora, me las arreglé para:

  • Crear un SpiceService personalizado
  • Hacer pocas solicitudes para obtener datos de la WS
  • Persistir los datos en DB con ORMLite

… gracias a la muestra "robospice-sample-ormlite" .

Principales partes de mi aplicación (preguntas en la parte inferior):

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

La aplicación se compone de una pantalla de bienvenida (SplashActivity) y otras actividades. La pantalla inicial inicia la Actividad principal después de unos segundos (sólo un temporizador por el momento).

Lo que me gustaría hacer es descargar todos los datos de la pantalla de bienvenida (RoboSpice ya caché / persistir estos datos en la base de datos SQLite) y luego acceder a ella desde otras actividades.


Pregunta 1: ¿Es posible acceder y manipular los datos de la base de datos fuera de SplashActivity? ¿Cómo (puede proporcionar algunos ejemplos de código)?

La página Wiki sobre "RoboSpiceDataBaseHelper" no es muy clara para mí: se afirma que "RoboSpiceDataBaseHelper se utiliza para administrar la creación de bases de datos y la gestión de versiones", pero en el siguiente párrafo se afirma que algún método permite "consultar y recuperar datos de la base de datos ". En las muestras de RoboSpice, no hay nada sobre la recuperación de datos de otras actividades. ¿Cómo aprovechar el poder de ORMLite?

He leído este tema de Grupos de Google de Snicolas:

Tenga en cuenta que el almacenamiento en caché de RoboSpice está destinado a ser transparente y está completamente encapsulado en el SpiceService. Debe ser possilbe acceder al sistema de caché (en su caso el databse) directamente a través de una referencia compartida a él (compartido por el servicio y sus actividades). Además, en ese caso, nada evitará efectos secundarios como acceso concurrente o inconsistencia de base de datos.

¿Así que cómo? Estoy totalmente perdido 🙁

Edit 03/01: Debido a mi falta de competencia con RoboSpice y ORMLite, estoy confundido en cómo implementar tal solución / para hacer esto yo mismo (al menos de manera eficiente). No veo cómo utilizar / combinar RoboSpiceDatabaseHelper, InDatabaseObjectPersister, InDatabaseObjectPersisterFactory …


Pregunta 2:

Mi última pregunta no está relacionada con el acceso a los datos (tomo este tema para preguntar).

¿Por qué getSpiceManager().execute(barsRequest, new Integer(1), DurationInMillis.ONE_HOUR, null) no hace nada (sin devolución de llamada al RequestListener)? De hecho, en mi caso (pantalla de bienvenida), no necesito de la devolución de llamada. ¿Puedo evitarlo?


¡Gracias!

Pregunta 1 :

Usted tiene que compartir el RoboSpiceDatabaseHelper entre su servicio y los lugares que desea acceder a él.

La manera más limpia es usar un marco de inyección como RoboGuice. Un hack rápido y sucio es crear un proveedor estático para esta instancia, o incluso más sucio y más rápido, hacer el RoboSpiceDatabaseHelper un singleton.

—ACTUALIZAR

Al usar RoboGuice, puede:

Cree su propia clase RoboSpiceDatabaseHelper y anótelo con @Singleton:

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

Tanto en su spiceservice como en las clases que necesitan un acceso a la base de datos, puede declarar un miembro como:

 @Inject RoboSpiceDatabaseHelper databaseHelper; 

Usted recibirá un singleton adecuado, entonces, lo que le permite compartir el acceso a la base de datos.

Pregunta 2 :

Si usted realmente necesita ir rápido, simplemente cree un escucha de stub / dummy. RS no ejecutará una petición sin escuchar.

  • ¿Cómo se genera la clase con T y List <T>
  • Obtención de datos del caché antes de ejecutar una solicitud de red con RoboSpice
  • ¿Puedo usar SpiceManager dentro de un servicio?
  • ¿Cómo aumentar el tiempo de espera para las solicitudes de reacondicionamiento en robospice android?
  • Uso de RoboSpice con Jackson2 y Spring
  • RoboSpice lanzando excepciones okhttp
  • Detener un proceso de fondo en robospice
  • Robospice - Mantenga el servicio de especias continuando funcionando cuando cambia la actividad
  • ¿Cómo usar Mockito para probar las API a lo largo de Robospice y Retrofit?
  • Retrofit / Robospice: ¿Obtener los encabezados de respuesta de una solicitud exitosa?
  • Uso de adaptadores de sincronización + Volley / RoboSpice para procesamiento sincronizado de solicitudes de red
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.