Realm en Android – ¿Cómo seleccionar varios objetos por lista de identificadores (@PrimaryKey)?

Estoy construyendo una aplicación para Android con la base de datos Realm.

Tengo una subclase RealmObject llamada Article que tiene un campo id (es e int y también un @PrimaryKey ). Me gustaría pasar a una consulta una lista de int s (un Set , int[] , o lo que sea) de ID del artículo y recuperar sólo los artículos.

En SQL sería así:

 SELECT * FROM `table` where ID in (5263, 5625, 5628, 5621) 

He visto que es posible hacer esto en iOS en esta pregunta StackOverflow .

¿Cómo puedo hacerlo en Android? ¡Gracias!

Editar: Sólo para informar, también he pedido esto en el reporte de GitHub aquí .

5 Solutions collect form web for “Realm en Android – ¿Cómo seleccionar varios objetos por lista de identificadores (@PrimaryKey)?”

Actualizar:

Realm 1.2.0 ha añadido RealmQuery.in() para una comparación con varios valores. La documentación detalla todas las sobrecargas disponibles. Este es el método que podemos usar si nuestros ids son Integer s:

 public RealmQuery<E> in(String fieldName, Integer[] values) 

Respuesta original:

La respuesta de @ChristianMelchior devuelve todos los artículos si la lista de ids está vacía. Quiero que devuelva un vacío RealmResults<Article> . Eso es lo que he terminado haciendo;

 Set<Integer> articleIds = this.getArticleIds(); RealmQuery<Article> query = realm.where(Article.class); if (articleIds.size() == 0) { // We want to return an empty list if the list of ids is empty. // Just search for an id that does not exist. query = query.equalTo("id", -30000); } else { int i = 0; for (int id : articleIds) { // The or() operator requires left hand and right hand elements. // If articleIds had only one element then it would crash with // "Missing right-hand side of OR" if (i++ > 0) { query = query.or(); } query = query.equalTo("id", id); } } return query.findAll(); 

El Realm Java API no es compatible con esto todavía, por desgracia. Puede seguir la solicitud de funciones aquí: https://github.com/realm/realm-java/issues/841

El trabajo actual sería crear la consulta usted mismo en un bucle for:

 RealmResults<Article> articles = realm.allObjects(Article.class); RealmQuery q = articles.where(); for (int id : ids) { q = q.equalTo("id", id); } RealmResults<Article> filteredArticles = q.findAll(); 

Ahora realm v 1.2.0 soporta RealmQuery.in() para una comparación con varios valores.

Esta es la manera Realm lo hace desde 1.2.0:

 public RealmQuery<E> in(String fieldName, String[] values) { if (values == null || values.length == 0) { throw new IllegalArgumentException(EMPTY_VALUES); } beginGroup().equalTo(fieldName, values[0]); for (int i = 1; i < values.length; i++) { or().equalTo(fieldName, values[i]); } return endGroup(); } 

Anteriormente así es como lo hice

Acabo de encontrar este poste y pensé que podría lanzar en mis 2 centavos en esto. Por mucho que aprecie a Christian Melchior y sus respuestas creo que en este caso su respuesta no está funcionando (al menos en la versión actual).

Yo prefiero hacerlo así – personalmente creo que es más legible que la respuesta de Albert Vila:

 List<String> listOfIds = [..]; RealmQuery<SomeClass> query = realm.where(SomeClass.class); boolean first = true; for (String id : listOfIds) { if (!first) { query.or(); } else { first = false; } query.equalTo("id", id); } RealmResults<SomeClass> results = query.findAll(); 
  • ¿Cuál es la forma correcta de tratar con multithreading y Realm?
  • Android - Prueba de un recurso de cadena con Robolectric
  • Android: Realm + Retrofit - Serializar apiresponse
  • Android Realm número de versión de migración basado en qué?
  • ¿Cuál es la manera más fácil de mantener una base de datos sincronizada entre varios dispositivos iOS y Android?
  • RealmResult consulta de nuevo
  • Un RealmObject sin @PrimaryKey no se puede actualizar
  • RxJava Multithreading con Realm - Acceso al dominio desde un subproceso incorrecto
  • Android RealmList <Integer> y RealmList <String>
  • Android Realm, objetos de consulta por atributo secundario
  • Realm + Retrofit + Rxjava
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.