3

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

我所有的数据对象都来自一个 API 的端点,例如:getPopular(), getNearbyPhotos(lat, lng), getUserPhotos(userId), getAlbumPhotos(albumId), getCollection(type). 在大多数这些端点上,还有更多参数,例如sort=best/chronological.

我们目前在项目中使用这个非关系数据库,它允许仅使用listName. 我们使用listName端点+参数的组合。

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();

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

在不使用我想出的这种肮脏的黑客攻击的情况下,如何仅根据插入的顺序和组来查询领域上的数据?

编辑:

后续问题:查询其他对象上包含的领域数据

4

1 回答 1

1

但是因为它是永远不会以视觉方式呈现给用户的数据,所以它不会发送给客户端(我想迁移到 Realm,但最好不要更改服务器端数据模型和端点行为)

这很可怜,但可以理解。

你能做的就是给你的领域 Photo 对象提供字段,比如

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);
    }
}

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

于 2016-07-01T09:57:57.780 回答