我正在考虑将我们当前的应用程序迁移到领域,并试图找出将数据组织成令状的最佳方法。对于这个问题,我将重点关注数据模型的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();
但是通过这种方法,我创建了一个额外的抽象层来简单地存储分组和排序元数据,我不满意,我在这里问:
如何根据插入的顺序和组查询领域中的数据,而不使用我提出的这种肮脏的黑客?
修改
答案 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);
}
}
现在你在领域有一堆照片对象,你可以像在服务器上一样查询。