【问题标题】:ObjectBox: Get objects with specific relationsObjectBox:获取具有特定关系的对象
【发布时间】:2017-09-28 10:01:06
【问题描述】:

期待MovieGenre这两个实体:

@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 正常工作,请在您的Genre-Entity 中覆盖equals-Method:

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

【问题讨论】:

    标签: java android objectbox


    【解决方案1】:

    不幸的是,这部分 API 还没有在 Java 中公开。我们希望尽快重构查询 API。

    在准备好之前,您可以使用query filtering 解决问题。为简洁起见,使用 Java/Kotlin-ish 代码的示例:

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

    (将在 Java 中与下一次更新类似。)

    【讨论】:

    • 我根据您的提示通过一个工作示例更新了我的问题!感谢您的回答以及上一次 droidcon 的精彩演讲;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 2014-09-17
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多