Realm.io y consultas asincrónicas

Estamos empezando a usar Realm.io en un proyecto de aplicación para Android. Pero algo que no nos gusta con la API Realm.io es la ausencia de cualquier forma asíncrona para consultar la base de datos. En proyectos antiguos usamos DbQuery y Sqlite, por lo que estamos acostumbrados a hacer las consultas de base de datos dentro de hilos o AsyncTask 's. Pero es bastante inquietante ver que en todos los ejemplos las consultas se realizan en el UiThread . ¿No es esto algo malo para el rendimiento de la aplicación ?. Hemos intentado hacer las consultas dentro de hilos o AsyncTasks, pero tenemos un error cuando accedemos a nuestros objetos de modelo de nuevo en el UiThread, diciendo que no podemos acceder a RealObjects en los hilos que no eran los que fueron consultados. Aquí está nuestro código de ejemplo:

 service.getDatabaseHelper() .with(getActivity()) //Context that I use to instance the Realm instance .onFinishQuery( new DatabaseHelper.IQueryGetCallback<UserRealm>() { @Override public void onGetResult(UserRealm[] results) { for(UserRealm aUser : results){ //Here is where it crashes Log.d("Log","Username -> "+aUser.getName()); } } }) .getUsersFromDb(); //....... //In our "DAO" class public void getUsersFromDb(){ new GetQueryTask() { @Override public UserRealm[] onQueryReadyToBeExecuted(Realm realmInstance) { RealmQuery<UserRealm> query = realmInstance.where(UserRealm.class); RealmResults<UserRealm> result = query.findAll(); // TODO hacer que devuelva un array ArrayList<UserRealm> users = new ArrayList<UserRealm>(); for (UserRealm u : result) { //Here we can read the RealObject's fine users.add(u); } return users.toArray(new UserRealm[users.size()]); } }.execute(); } //Our abstract task that wraps all the instantiation-transaction behaviour public abstract class GetQueryTask<T extends RealmObject> extends AsyncTask<Void, Void, T[]> { @Override protected T[] doInBackground(Void... params) { //We tried to instantiate this class in several places, here //Send it as parameter through the AsyncTask //context is set in the with(Context ctx) method. Realm realm = Realm.getInstance(context); return onQueryReadyToBeExecuted(realm); } public abstract T[] onQueryReadyToBeExecuted(Realm realmInstance); @Override protected void onPostExecute(T[] result) { mCallback.onExecute(result); } } 

Nuestra mayor preocupación no es el "error" de este código, pero si está bien hacer las consultas en el UiThread como lo hacen los desarrolladores de Realm.io en sus ejemplos. Si es ese el caso, todo este código para realizar las consultas de forma asincrónica ya no será neccesary.

2 Solutions collect form web for “Realm.io y consultas asincrónicas”

Cristiano de Reino aquí. Tiene razón en que actualmente se requieren consultas para ejecutar en el subproceso en el que se usan, lo que potencialmente puede tener un efecto negativo en el rendimiento del subproceso de UI. Sin embargo, somos muy conscientes de esto y trabajamos activamente para que sea posible mover los resultados de las consultas a través de los hilos.

Dicho esto, las consultas en Realm son bastante rápidas incluso para grandes cantidades razonables de datos y, debido a ello, sólo los datos de carga que utilice realmente pueden ser muy eficientes incluso cuando se ejecutan en el subproceso de la interfaz de usuario.

Yo le animaría a probarlo con cualquier tamaño de datos que parezca razonable y probar su rendimiento (en un dispositivo más viejo de preferencia :)). También es posible hacer trucos como añadir índices a las claves, hacer la consulta pesada en un hilo de fondo, enviar las claves al hilo de la interfaz de usuario y la consulta para ellos allí. Es un bandaid pero funcionará en algunos casos – tristemente no para listas sin embargo.

Realm 0.84 soporta ahora consultas asíncronas.

Puedes probarlo agregando 'io.realm: realm-android: 0.84.0-SNAPSHOT' a tu build.gradle. Hay algunos nuevos métodos

  • FindAllAsync
  • FindAllSortedAsync
  • FindFirstAsync

Debe agregar un addChangeListener (RealmChangeListener) al RealmResult para ser notificado cuando se complete la consulta.

Documentación: https://realm.io/docs/java/latest/#asynchronous-queries

  • Obtener cursor mediante la biblioteca Realm
  • ¿Cuál es la forma correcta de tratar con multithreading y Realm?
  • RealmList de tipo de cadena en Android
  • Realm.io Query con GroupBy
  • La migración de Realm se está estrellando en Android 7.1.2
  • Acceso de dominio a través de subprocesos con rxjava y dagger2
  • Android Realm - Objeto de Realm de paso usando Intent
  • Android no puede encontrar la dependencia gradle reino
  • Manera correcta de obtener el objeto Realm por su clave principal en Android Java
  • Manera correcta de abstraer el reino en las aplicaciones de Android
  • Inyección de dependencia en servicio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.