Многозначные свойства в реляционном сопоставлении объектов (приложение Android) - PullRequest
0 голосов
/ 24 января 2012

В приложении для Android, которое я создаю, я инкапсулирую реляционные запросы в слой модели.

Один из моих объектов, назовем его Place, имеет многозначное свойство (назовем его Image). Упрощенно я могу сказать, что модель в Java выглядит следующим образом:

class Place{
    List<Image> images;
    ...
}


class Image {
    String description;
    String imageName;
    ...
}

В базе данных эти классы отображаются в таблицы PLACE и IMAGE.

На стороне Java я использую DAO для запроса, вставки, обновления и удаления Place объектов.

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

class PlaceDataSource {
    public List<Place> findAll();
    public void update(Place place);
    public void add(Place place);
    public void delete(Place place);
    ...
}

Описание этих методов следующее:

Метод findAll отвечает на список Place с, каждый из которых содержит коллекцию Image объектов.

Метод update обновляет Place и его изображения (обновление, вставка новых изображений или удаление существующих изображений при необходимости).

Метод add добавляет новый Place со своими изображениями.

Метод delete удаляет Place со всеми его изображениями.

Методы findAll, add и delete очень легко реализовать. Однако я не видел простого способа реализации метода update, который учитывает многозначное свойство. Мне приходит в голову процедурный алгоритм:

  • Запрос из базы данных текущих сохраненных изображений из объекта Place для обновления.
  • Узнайте, какие Image объекты больше не присутствуют в свойстве images объекта Place и удалите их.
  • Обновите сохраненные изображения, которые существуют в свойстве images.
  • Добавление новых изображений, присутствующих в свойстве images.

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

Я думал об использовании двух разных DAO в этом сценарии, один для сохранения Place объектов и другой для Image объектов. Тогда Place DAO не будет нести ответственность за постоянство объектов изображений, а «бизнес» уровень должен поддерживать их согласованность. Тем не менее, Image являются концептуально частью Place объектов, поэтому это решение не полностью меня убедило.

Большое спасибо за отзыв!

Примечание: в настоящее время я не заинтересован в использовании платформы ORM для Android, просто хотел бы найти ответ на эту проблему с концептуальной точки зрения.

1 Ответ

1 голос
/ 25 января 2012

Я автор ORMLite , который делает все это за вас, но есть несколько способов сделать это самостоятельно.

Вы можете написать свой собственный Listкласс (Collection будет проще), который реализует нужные вам методы: add, remove и т. д. Они будут изменять список и вызывать через методы DAO.В качестве примера кода вы можете взглянуть на то, как ORMLite делает это BaseForeignCollection и EagerForeignCollection, но это, вероятно, излишне для ваших нужд.

Проще было быбыть, как вы упоминаете, чтобы поддерживать список вручную.Возможно, добавьте методы в PlaceDataSource (которые кажутся DAO больше, чем DataSource), которые удалили бы оба из списка и базы данных.Что-то вроде:

class PlaceDataSource {
    /** deletes image at location index from list and removes from database */
    public void deleteImage(Place place, int index);
    /** add image to the list and to the database */
    public void addImage(Place place, Image image);
    ...

Вам нужно убедиться, что вы не используете список напрямую, иначе он не синхронизируется с базой данных.

Вы также можете использовать эти методына самом Place, а затем каждый объект Place должен быть введен с его DAO.Некоторым людям нравится этот шаблон, но я всегда думал, что использование методов DAO в другом классе было бы чище.

Надеюсь, это поможет.

...