Организация данных Android Realm в списках
Я пытаюсь перенести наше текущее приложение в сферу и пытаюсь выяснить, как лучше организовать данные в стопку. Для этого вопроса я сосредоточусь на Photo
объект моей модели данных (но есть и другие).
Все мои объекты данных поступают из API с такими конечными точками, как: getPopular()
, getNearbyPhotos(lat, lng)
, getUserPhotos(userId)
, getAlbumPhotos(albumId)
, getCollection(type)
, На большинстве этих конечных точек есть дополнительные параметры, такие как sort=best/chronological
,
В настоящее время мы используем эту нереляционную БД в проекте, которая позволяет сортировать и извлекать список объектов, используя только listName
, Мы используем listName
как комбинация параметров конечной точки +.
Область (как реляционная БД) использует стандартные запросы, такие как:
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();
Но с этим подходом я создаю дополнительный уровень абстракции, чтобы просто хранить метаданные группировки и упорядочения, что меня не устраивает, и я спрашиваю здесь:
Как я могу запрашивать данные в области, основываясь на порядке и группе, в которую они были вставлены, не используя этот грязный хак, который я придумал?
редактировать:
дополнительный вопрос к этому: запрос данных области, содержащихся на другом объекте
1 ответ
Но поскольку эти данные никогда не представляются пользователю визуально, они не отправляются клиенту (я хотел бы перейти на Realm, но было бы лучше сделать это без необходимости изменения моделей данных на стороне сервера и поведения конечных точек)
Это жалко, но понятно.
То, что вы можете сделать, это дать вашей области Photo объекты поля в любом случае, например,
public class Photo extends RealmObject {
// other fields
private double latitude;
private double longitude;
private String score;
}
Затем вы запрашиваете сервер с конечной точкой API и параметрами, как сейчас.
Когда результаты получены, вы сохраняете их в области, а также присваиваете им значения для широты / долготы / оценки. На данный момент они доступны, потому что вы просто использовали их в запросе к серверу.
Так что если вы запрашиваете 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);
}
}
Теперь у вас есть куча фотообъектов в области, которые вы можете запрашивать так же, как и на сервере.