2016-07-01 3 views
3

Я изучаю миграцию нашего текущего приложения в область и пытаюсь выяснить, какой способ организовать данные в полосе. По этому вопросу я сосредоточусь на объекте моей модели данных Photo (но есть и другие).Организуйте данные Android Realm в списках

Все мои объекты данных прибывают из 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 .so I «м в состоянии найти эти объекты с помощью простого запроса

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

Но с таким подходом я создаю дополнительный слой абстракции, чтобы просто хранить группировки и заказные метаданные, которые я не доволен, и я спрашиваю здесь :

Как я могу запросить данные о царстве на простом заказе и группе, в которую он был вставлен без использования этого грязного взлома? Я придумал?

редактировать:

последующий вопрос, что: Query realm data contained on other object

+0

Я не уверен, что это возможно, так как вы хотите запросить поля, которые недоступны локально. Почему у вашей фотографии нет полей местоположения/оценки? Я предполагаю, что они делают на сервере –

+0

@TimCastelijns точно, у них есть на сервере. Но поскольку это данные, которые никогда визуально не представлены пользователю, они не отправляются клиенту (я бы хотел перейти на Realm, но было бы лучше сделать это, не изменяя модели данных на стороне сервера и поведение на конечных точках) – Budius

ответ

1

Но потому, что данные, которые никогда не визуально представлены пользователю, не посылается клиенту (я хотел бы для миграции в Царство, но было бы лучше сделать это без необходимости менять модели данных на стороне сервера и поведение на конечных точках)

Это жалко, но понятно.

Что вы можете сделать, это дать вашей области Фото объектов поля в любом случае, как

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

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

+0

Я считаю это правильным, потому что он правильно указывает, как работает Realm и указывает на другое решение. Но мне придется углубиться в некоторые детали API, и я не уверен, что смогу использовать это. Например, 'getNearby()' Я не могу просто поместить текущий lat/lng, потому что, когда пользователь перемещается на 10 метров в сторону, фото все еще находится рядом, но оно не будет отображаться в результате из-за абсолютных значений. – Budius

Смежные вопросы