2017-09-28 3 views
0

erwarten, dass die beiden Einheiten Movie und Genre:ObjectBox: Erhalten Sie Objekte mit spezifischen Beziehungen

@Entity 
public class Movie { 

@Id 
private long id; 
private String name; 
private ToMany<Genre> genres; 

[...] 
} 

@Entity 
public class Genre { 

@Id 
private long id; 
private String name; 

[...] 
} 

Wir alle wissen, wie man eine Beziehung erstellen und speichern:

Movie movie = new Movie(); 
movie.setTitle("Star Wars"); 
movie.getGenres().add(new Genre("Sci-Fi"); 
box.put(movie); 

aber gibt es eine Möglichkeit, Abfrage alle Movie -Objekte mit einer bestimmten Genre? Wie

Box<Movie> box = boxStore.boxFor(Movie.class); 

Query query = box.query() 
    .equal(Genre_.name, "Sci-Fi") // note that I want to query the Movie-Box with Genre-properties 
    .build(); 
List movies = query.find(); 

Mein Ziel ist es, alle Filme mit einem bestimmten Genre auf einfache Art und Weise zu finden. Weiß jemand wie man das macht oder muss ich alle Filme abfragen und das Ergebnis selbst filtern? Oder muss ich meine Entitäten anders anpassen?

Update: vorbereitet ich die richtige markierte Antwort unten zu einem Arbeitsbeispiel:

final Genre genreSciFi = genreBox.query().equal(Genre_.name, "Sci-Fi").build().findFirst(); 

    List<Movie> filteredMovies = movieBox.query().filter(new QueryFilter<Movie>() { 
     @Override 
     public boolean keep(@NonNull Movie entity) { 
      return entity.getGenres().contains(genreSciFi); 
     } 
    }).build().find(); 

Um die contains -Methode Arbeit richtig zu machen, außer Kraft setzen equals -Methode in Ihrem Genre -Entity:

@Override 
public boolean equals(Object obj) { 
    return obj instanceof Genre && ((Genre) obj).getId() == id && ((Genre) obj).getName().equals(name); 
} 

Antwort

1

Leider ist dieser Teil der API noch nicht in Java verfügbar. Wir möchten die Query-API sehr bald umgestalten.

Bis das bereit ist, können Sie umgehen, indem Sie query filtering verwenden. Beispiel unter Verwendung von Java/Kotlin-ish-Code für Kürze:

Query query = movieBox.query().filter(movie -> { 
    return genres.contains(genre -> { 
     return "Sci-Fi".equals(genre.getName()) 
    } 
}).build() 

(. Wird es ähnlich machen in Java mit dem nächsten Update)

+0

ich meine Frage auf Ihrem Hinweis auf Basis von einem Arbeitsbeispiel aktualisiert! Danke für deine Antwort und für das nette Gespräch auf dem letzten droidcon ;-) – JU5T1C3

+0

Vielen Dank und schön zu sehen, dass es funktioniert! –

Verwandte Themen