ObjectBox:获取具有特定关系的对象
期待这两个实体Movie
和Genre
:
@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; [...] }
我们都知道如何创建一个关系并保存它:
Movie movie = new Movie(); movie.setTitle("Star Wars"); movie.getGenres().add(new Genre("Sci-Fi"); box.put(movie);
但有没有可能查询具有特定Genre
所有Movie
对象? 喜欢
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();
我的目标是以简单的方式找到所有具有特定类型的电影。 有谁知道如何做,或者我必须查询所有的电影,并自行筛选结果? 还是我必须以另一种方式适应我的实体?
更新:我准备了正确的标记答案下面的一个工作的例子:
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();
要使contains
-Method正确地工作,覆盖equals
您的Genre
方法 – 实体:
@Override public boolean equals(Object obj) { return obj instanceof Genre && ((Genre) obj).getId() == id && ((Genre) obj).getName().equals(name); }
不幸的是,这部分API还没有在Java中公开。 我们希望尽快重构查询API。
在准备就绪之前,您可以使用查询过滤来解决问题 。 为简洁起见,使用Java / Kotlin-ish代码示例:
Query query = movieBox.query().filter(movie -> { return genres.contains(genre -> { return "Sci-Fi".equals(genre.getName()) } }).build()
(在下一次更新时,会使它与Java类似)
- Android Studio 3.1 Canary 4 Genymotion模拟器插件失败
- Kotlin Dagger2找不到符号ApplicationModule_ProvideApplicationFactory
- Android Studio / Kotlin:Gradle错误 – 找不到参数的compile()方法
- 将Java位图转换为字节数组
- kotlin:用多个lambdaexpression式调用高阶函数
- Android与Kotlin – 如何使用HttpUrlConnection
- 将支持库更新到27.0.0后,我的片段中有多个错误
- Android RecyclerView无限滚动而不使用NULL对象来加载指标
- Android无法解析符号’?attr / selectableItemBackground’