在列表中组织Android Realm数据

时间:2016-07-01 08:40:52

标签: android realm realm-list

我正在考虑将我们当前的应用程序迁移到领域,并试图找出将数据组织成令状的最佳方法。对于这个问题,我将重点关注数据模型的Photo对象(但还有其他对象)。

我的所有数据对象都来自API,端点包括:getPopular()getNearbyPhotos(lat, lng)getUserPhotos(userId)getAlbumPhotos(albumId)getCollection(type)。在大多数端点上还有其他参数,例如sort=best/chronological

我们目前在项目中使用this non-relational DB,它允许仅使用listName对对象列表进行排序和检索。我们使用listName作为endpoit +参数的组合。

Realm(作为关系数据库)使用标准查询,例如:

realm.where(User.class)
     .contains("name", "Doe")
     .findAll();

当所有数据在本地可用时工作正常,但问题是这些查询的大量数据保留在服务器端,从不发送到客户端。例如,Photo模型不包含位置,也不包含best排序的分数。

在我目前的测试项目中,我通过创建一个类似于我们当前项目使用对象的ListPhoto来解决这个问题:

public class ListPhoto extends RealmObject {
   @PrimaryKey public String id;
   public RealmList<Photo> list;
}

并将实际的API端点和参数用作id。所以我能够通过简单的查询找到这些对象

ListPhoto listPhoto = realm
          .where(ListPhoto.class)
          .equalTo("id", id)
          .findFirst();

但是通过这种方法,我创建了一个额外的抽象层来简单地存储分组和排序元数据,我不满意,我在这里问:

如何根据插入的顺序和组查询领域中的数据,而不使用我提出的这种肮脏的黑客?

修改

后续问题:Query realm data contained on other object

1 个答案:

答案 0 :(得分:1)

  

但是因为它的数据从未在视觉上呈现给用户,所以它不会被发送到客户端(我想迁移到Realm,但更好的做法是不必更改服务器端数据模型和终止行为)

那可怜但可以理解。

你可以做的就是让你的领域照片对象成为领域,比如

public class Photo extends RealmObject {
    // other fields

    private double latitude;
    private double longitude;
    private String score;
}

然后,您像现在一样使用API​​端点和参数查询服务器。

当结果出现时,您将它们存储在领域中,并为它们分配lat / long / score的值。此时您可以使用这些,因为您只是在服务器查询中使用它们。

因此,如果您查询api/getNearbyPhotos(1, 2)?sort=best
(伪代码)

api.fetch("getNearbyPhotos(1, 2)?sort=best", new GetPhotoCompleteListener {
    @Override
    void onSuccess(List<Photo> photos) {
        // assuming gson or something has already parsed the server response into photo objects
        for (Photo p : photos) {
            p.setLatitude(1);
            p.setLongitude(2);
            p.setScore("best");
        }
        realm.copyToRealmOrUpdate(photos);
    }
}

现在你在领域有一堆照片对象,你可以像在服务器上一样查询。