Организация данных 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);
    }
}

Теперь у вас есть куча фотообъектов в области, которые вы можете запрашивать так же, как и на сервере.

Другие вопросы по тегам