2016-10-09 2 views
1

ФОНОМКак можно обеспечить согласованность между множественными экземплярами модели объекта

Это проблема, которую я продолжаю возвращаться как я разработка Android приложения. Скажем, мое приложение позволяет пользователям «следить» за телешоу. Моя TVShow модель класса выглядит следующим образом:

public class TVShow { 
    String title; 
    String[] show_cast; 
    boolean currently_airing = true; 
    boolean following = false; 
    long nextEpisodeTime; 
    String genre; 
} 

У меня есть база данных SQL, которая хранит сотни телевизионных шоу. Это полезно, потому что я могу использовать подробные запросы для выбора шоу на основе конкретной информации. Проблема, которую я получаю, - это когда у меня есть несколько экземпляров TVShow, которые представляют одно и то же шоу.

Пример

Скажем, у меня есть ТВ-шоу «The Walking Dead» в моей базе данных и создать TVShow объект из запроса SQL. Этот экземпляр объекта будет называться TVShow#1. Я решил «следить» за этим шоу, поэтому я установил TVShow#1.following = true. Где-то еще в моем приложении я запрашиваю список показов, которые в настоящее время транслируются, в которые входит «The Walking Dead». Новый экземпляр TVShow будет создан для этого списка TVShow#2. Проблема здесь в том, что у меня есть два объекта TVShow, TVShow#1 и TVShow#2, которые представляют «The Walking Dead», но они имеют разные значения для following. Это вызовет проблемы во всей логике моего приложения, потому что между всеми TVShow экземплярами, которые представляют одно и то же телешоу, не существует согласованности.

MY BAD РЕШЕНИЕ

Увеличить это кучу экземпляров объектов и гораздо более сложных полей и логики, и это положение я в настоящее время. Я смягчила это путем загрузки всех данных SQL в память (обычно ArrayList или HashMap), когда приложение запускается и запрашивает только эти объекты Java вместо базы данных SQL. Это решение неэффективно и неудобно, где SQL-запросы действительно могут помочь. Надеюсь, мои примеры не слишком запутывают. Если я смогу уточнить или предоставить дополнительную информацию, я был бы счастлив. Пожалуйста, дайте мне знать, есть ли что-то лучшее, что я могу сделать, чтобы обеспечить согласованность между несколькими экземплярами одного и того же объекта модели.

+0

Как сохранить только экземпляр в hashmap вместо всех данных? – Erik

ответ

0

Решение, которое я использую для этой проблемы, основано на RxJava, однако его можно реализовать без Rx.

Идея состоит в том, что вы подписываетесь на данные из запроса к базе данных. Каждый раз, когда есть запись в базу данных, которая затрагивает одну из таблиц, к которой обращается ваш запрос, запрос снова запускается, и вы получаете свежий набор данных.

Этот способ, когда TVShow1 сохраняется в базе данных, запрос, который произвел TVShow2, перезапускается, и у вас есть последняя версия данных.

Есть две библиотеки, которые делают все это для вас, если вы используете Rx:

StorIO
sqlbrite

Если вы не используете Rx, то Realm имеет схожую функциональность со своими адаптерами изменения.

Наконец-то вы можете свернуть самостоятельно. Это будет связано с наличием singleton, с которым вы регистрируете свои запросы, с привязкой к таблицам, которые они читают. Каждый раз, когда вы делаете запись, вы позволяете этому классу знать, какие таблицы были изменены, и повторно запускает ваши запросы.

+0

Это звучит очень интересно. Я не использую RxJava, поэтому я дам Realm взгляду. В настоящее время я использую SugarORM для управления транзакциями SQL, поэтому мне нужно будет изучить миграцию данных. –

0

Похоже, что «следующее» свойство должно быть собственностью пользователя, а не телешоу.

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

+0

Это хорошее решение. Как насчет другого сценария: я использую API, который предоставляет информацию о телешоу. Когда я использую этот API, я обновляю объекты TVShow и их атрибуты с новой информацией. Другие ранее существовавшие экземпляры этих телешоу не будут содержать эту обновленную информацию. Как бы вы это взяли? Примером этих данных может быть выбор времени для новых выпусков эпизодов. –

+0

Это та же проблема. У вас есть несколько экземпляров одного и того же TVShow, плавающего вокруг вашего приложения, выходящего из синхронизации. Вам нужно только один экземпляр каждого ТВ-шоу, доступного вашему приложению, если нет значимой разницы между двумя экземплярами одного и того же телешоу. Вы можете хранить все ТВ-шоу в одной структуре данных со ссылками на их идентификаторы SQL, а затем, когда вам нужно обновлять значения (например, использовать API), непосредственно обновлять соответствующие записи SQL и снова вставлять их в свое приложение. – Walker