/* * Copyright (C) 2013 Simon Vig Therkildsen * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.simonvt.cathode.provider; import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import java.util.Set; import net.simonvt.cathode.provider.DatabaseContract.CommentColumns; import net.simonvt.cathode.provider.DatabaseContract.EpisodeColumns; import net.simonvt.cathode.provider.DatabaseContract.LastModifiedColumns; import net.simonvt.cathode.provider.DatabaseContract.ListItemColumns; import net.simonvt.cathode.provider.DatabaseContract.ListsColumns; import net.simonvt.cathode.provider.DatabaseContract.MovieCastColumns; import net.simonvt.cathode.provider.DatabaseContract.MovieColumns; import net.simonvt.cathode.provider.DatabaseContract.MovieCrewColumns; import net.simonvt.cathode.provider.DatabaseContract.MovieGenreColumns; import net.simonvt.cathode.provider.DatabaseContract.PersonColumns; import net.simonvt.cathode.provider.DatabaseContract.RecentQueriesColumns; import net.simonvt.cathode.provider.DatabaseContract.RelatedMoviesColumns; import net.simonvt.cathode.provider.DatabaseContract.RelatedShowsColumns; import net.simonvt.cathode.provider.DatabaseContract.SeasonColumns; import net.simonvt.cathode.provider.DatabaseContract.ShowCastColumns; import net.simonvt.cathode.provider.DatabaseContract.ShowColumns; import net.simonvt.cathode.provider.DatabaseContract.ShowCrewColumns; import net.simonvt.cathode.provider.DatabaseContract.ShowGenreColumns; import net.simonvt.cathode.provider.DatabaseContract.UserColumns; import net.simonvt.cathode.provider.generated.CathodeDatabase; import net.simonvt.cathode.util.SqlIndex; import net.simonvt.cathode.util.SqlUtils; import net.simonvt.schematic.annotation.DataType; import net.simonvt.schematic.annotation.Database; import net.simonvt.schematic.annotation.ExecOnCreate; import net.simonvt.schematic.annotation.IfNotExists; import net.simonvt.schematic.annotation.OnUpgrade; import net.simonvt.schematic.annotation.Table; @Database(className = "CathodeDatabase", packageName = "net.simonvt.cathode.provider.generated", fileName = "cathode.db", version = DatabaseSchematic.DATABASE_VERSION) public final class DatabaseSchematic { private DatabaseSchematic() { } static final int DATABASE_VERSION = 37; public interface Joins { String SHOWS_UNWATCHED = "LEFT OUTER JOIN episodes ON episodes._id=(SELECT episodes._id FROM" + " episodes WHERE episodes.watched=0 AND episodes.showId=shows._id AND episodes.season<>0" + " AND episodes.needsSync=0" + " ORDER BY episodes.season ASC, episodes.episode ASC LIMIT 1)"; String SHOWS_UPCOMING = "LEFT OUTER JOIN " + Tables.EPISODES + " ON " + Tables.EPISODES + "." + EpisodeColumns.ID + "=" + "(" + "SELECT _id " + "FROM episodes " + "JOIN (" + "SELECT season, episode " + "FROM episodes " + "WHERE watched=1 AND showId=shows._id " + "ORDER BY season DESC, episode DESC LIMIT 1" + ") AS ep2 " + "WHERE episodes.watched=0 AND episodes.showId=shows._id" + " AND episodes.needsSync=0" + " AND (episodes.season>ep2.season " + "OR (episodes.season=ep2.season AND episodes.episode>ep2.episode)) " + "ORDER BY episodes.season ASC, episodes.episode ASC LIMIT 1" + ")"; String SHOWS_WITH_NEXT = "LEFT OUTER JOIN " + Tables.EPISODES + " ON " + Tables.EPISODES + "." + EpisodeColumns.ID + "=" + "(" + "SELECT _id " + "FROM episodes " + "JOIN (" + "SELECT season, episode " + "FROM episodes " + "WHERE watched=1 AND showId=shows._id " + "ORDER BY season DESC, episode DESC LIMIT 1" + ") AS ep2 " + "WHERE episodes.watched=0 AND episodes.showId=shows._id" + " AND episodes.needsSync=0" + " AND (episodes.season>ep2.season " + "OR (episodes.season=ep2.season AND episodes.episode>ep2.episode)) " + "ORDER BY episodes.season ASC, episodes.episode ASC LIMIT 1" + ")"; String SHOWS_UNCOLLECTED = "LEFT OUTER JOIN episodes ON episodes._id=(SELECT episodes._id FROM" + " episodes WHERE episodes.inCollection=0 AND episodes.showId=shows._id" + " AND episodes.season<>0" + " AND episodes.needsSync=0" + " AND episodes.needsSync=0" + " ORDER BY episodes.season ASC, episodes.episode ASC LIMIT 1)"; String SHOWS_WITH_WATCHING = "LEFT OUTER JOIN episodes ON episodes._id=(SELECT episodes._id FROM" + " episodes WHERE (episodes.watching=1 OR episodes.checkedIn=1)" + " AND episodes.showId=shows._id" + " AND episodes.needsSync=0" + " ORDER BY episodes.season ASC, episodes.episode ASC LIMIT 1)"; String SHOW_RELATED = "JOIN " + Tables.SHOWS + " AS " + Tables.SHOWS + " ON " + Tables.SHOWS + "." + ShowColumns.ID + "=" + Tables.SHOW_RELATED + "." + RelatedShowsColumns.RELATED_SHOW_ID; String MOVIE_RELATED = "JOIN " + Tables.MOVIES + " AS " + Tables.MOVIES + " ON " + Tables.MOVIES + "." + MovieColumns.ID + "=" + Tables.MOVIE_RELATED + "." + RelatedMoviesColumns.RELATED_MOVIE_ID; String SHOW_CAST_PERSON = "JOIN " + Tables.PEOPLE + " AS " + Tables.PEOPLE + " ON " + Tables.PEOPLE + "." + PersonColumns.ID + "=" + Tables.SHOW_CAST + "." + ShowCastColumns.PERSON_ID; String SHOW_CAST_SHOW = "JOIN " + Tables.SHOWS + " AS " + Tables.SHOWS + " ON " + Tables.SHOWS + "." + ShowColumns.ID + "=" + Tables.SHOW_CAST + "." + ShowCrewColumns.SHOW_ID; String SHOW_CAST = SHOW_CAST_PERSON + " " + SHOW_CAST_SHOW; String SHOW_CREW_PERSON = "JOIN " + Tables.PEOPLE + " AS " + Tables.PEOPLE + " ON " + Tables.PEOPLE + "." + PersonColumns.ID + "=" + Tables.SHOW_CREW + "." + ShowCrewColumns.PERSON_ID; String SHOW_CREW_SHOW = "JOIN " + Tables.SHOWS + " AS " + Tables.SHOWS + " ON " + Tables.SHOWS + "." + ShowColumns.ID + "=" + Tables.SHOW_CREW + "." + ShowCrewColumns.SHOW_ID; String SHOW_CREW = SHOW_CREW_PERSON + " " + SHOW_CREW_SHOW; String MOVIE_CAST_PERSON = "JOIN " + Tables.PEOPLE + " AS " + Tables.PEOPLE + " ON " + Tables.PEOPLE + "." + PersonColumns.ID + "=" + Tables.MOVIE_CAST + "." + MovieCastColumns.PERSON_ID; String MOVIE_CAST_MOVIE = "JOIN " + Tables.MOVIES + " AS " + Tables.MOVIES + " ON " + Tables.MOVIES + "." + MovieColumns.ID + "=" + Tables.MOVIE_CAST + "." + MovieCrewColumns.MOVIE_ID; String MOVIE_CAST = MOVIE_CAST_PERSON + " " + MOVIE_CAST_MOVIE; String MOVIE_CREW_PERSON = "JOIN " + Tables.PEOPLE + " AS " + Tables.PEOPLE + " ON " + Tables.PEOPLE + "." + PersonColumns.ID + "=" + Tables.MOVIE_CREW + "." + MovieCrewColumns.PERSON_ID; String MOVIE_CREW_MOVIE = "JOIN " + Tables.MOVIES + " AS " + Tables.MOVIES + " ON " + Tables.MOVIES + "." + MovieColumns.ID + "=" + Tables.MOVIE_CREW + "." + MovieCrewColumns.MOVIE_ID; String MOVIE_CREW = MOVIE_CREW_PERSON + " " + MOVIE_CREW_MOVIE; String EPISODES_WITH_SHOW = "LEFT OUTER JOIN " + Tables.SHOWS + " ON " + Tables.SHOWS + "." + ShowColumns.ID + "=" + Tables.EPISODES + "." + EpisodeColumns.SHOW_ID; String EPISODES_WITH_SHOW_TITLE = "JOIN " + Tables.SHOWS + " AS " + Tables.SHOWS + " ON " + Tables.SHOWS + "." + ShowColumns.ID + "=" + Tables.EPISODES + "." + EpisodeColumns.SHOW_ID; String LIST_SHOWS = "LEFT JOIN " + Tables.SHOWS + " ON " + ListItemColumns.ITEM_TYPE + "=" + DatabaseContract.ItemType.SHOW + " AND " + Tables.LIST_ITEMS + "." + ListItemColumns.ITEM_ID + "=" + Tables.SHOWS + "." + ShowColumns.ID; String LIST_SEASONS = "LEFT JOIN " + Tables.SEASONS + " ON " + ListItemColumns.ITEM_TYPE + "=" + DatabaseContract.ItemType.SEASON + " AND " + Tables.LIST_ITEMS + "." + ListItemColumns.ITEM_ID + "=" + Tables.SEASONS + "." + SeasonColumns.ID; String LIST_EPISODES = "LEFT JOIN " + Tables.EPISODES + " ON " + ListItemColumns.ITEM_TYPE + "=" + DatabaseContract.ItemType.EPISODE + " AND " + Tables.LIST_ITEMS + "." + ListItemColumns.ITEM_ID + "=" + Tables.EPISODES + "." + EpisodeColumns.ID; String LIST_MOVIES = "LEFT JOIN " + Tables.MOVIES + " ON " + ListItemColumns.ITEM_TYPE + "=" + DatabaseContract.ItemType.MOVIE + " AND " + Tables.LIST_ITEMS + "." + ListItemColumns.ITEM_ID + "=" + Tables.MOVIES + "." + MovieColumns.ID; String LIST_PEOPLE = "LEFT JOIN " + Tables.PEOPLE + " ON " + ListItemColumns.ITEM_TYPE + "=" + DatabaseContract.ItemType.PERSON + " AND " + Tables.LIST_ITEMS + "." + ListItemColumns.ITEM_ID + "=" + Tables.PEOPLE + "." + PersonColumns.ID; String LIST = LIST_SHOWS + " " + LIST_SEASONS + " " + LIST_EPISODES + " " + LIST_MOVIES + " " + LIST_PEOPLE; String COMMENT_PROFILE = "JOIN " + Tables.USERS + " AS " + Tables.USERS + " ON " + Tables.USERS + "." + UserColumns.ID + "=" + Tables.COMMENTS + "." + CommentColumns.USER_ID; } public interface Tables { @Table(ShowColumns.class) @IfNotExists String SHOWS = "shows"; @Table(ShowGenreColumns.class) @IfNotExists String SHOW_GENRES = "showGenres"; @Table(SeasonColumns.class) @IfNotExists String SEASONS = "seasons"; @Table(EpisodeColumns.class) @IfNotExists String EPISODES = "episodes"; @Table(ShowCastColumns.class) @IfNotExists String SHOW_CAST = "showCast"; @Table(ShowCrewColumns.class) @IfNotExists String SHOW_CREW = "showCrew"; @Table(RelatedShowsColumns.class) @IfNotExists String SHOW_RELATED = "relatedShows"; @Table(MovieColumns.class) @IfNotExists String MOVIES = "movies"; @Table(MovieGenreColumns.class) @IfNotExists String MOVIE_GENRES = "movieGenres"; @Table(MovieCastColumns.class) @IfNotExists String MOVIE_CAST = "movieCast"; @Table(MovieCrewColumns.class) @IfNotExists String MOVIE_CREW = "movieCrew"; @Table(RelatedMoviesColumns.class) @IfNotExists String MOVIE_RELATED = "relatedMovies"; @Table(PersonColumns.class) @IfNotExists String PEOPLE = "people"; @Table(RecentQueriesColumns.class) @IfNotExists String RECENT_QUERIES = "recentQueries"; @Table(ListsColumns.class) @IfNotExists String LISTS = "lists"; @Table(ListItemColumns.class) @IfNotExists String LIST_ITEMS = "listItems"; @Table(UserColumns.class) @IfNotExists String USERS = "users"; @Table(CommentColumns.class) @IfNotExists String COMMENTS = "comments"; } interface References { String SHOW_ID = "REFERENCES " + Tables.SHOWS + "(" + ShowColumns.ID + ")"; String SEASON_ID = "REFERENCES " + Tables.SEASONS + "(" + SeasonColumns.ID + ")"; String MOVIE_ID = "REFERENCES " + Tables.MOVIES + "(" + MovieColumns.ID + ")"; } interface TriggerName { String EPISODE_UPDATE_AIRED = "episodeUpdateAired"; String EPISODE_UPDATE_WATCHED = "episodeUpdateWatched"; String EPISODE_UPDATE_COLLECTED = "episodeUpdateCollected"; String EPISODE_UPDATE_WATCHING = "episodeUpdateWatching"; String EPISODE_INSERT = "episodeInsert"; String EPISODE_UPDATE = "episodeUpdate"; String EPISODE_DELETE = "episodeDelete"; String SHOW_UPDATE = "showUpdate"; String SHOW_DELETE = "showDelete"; String SEASON_UPDATE = "seasonUpdate"; String SEASON_DELETE = "seasonDelete"; String MOVIES_UPDATE = "moviesUpdate"; String MOVIE_DELETE = "movieDelete"; String PEOPLE_UPDATE = "peopleUpdate"; String LIST_UPDATE = "listUpdate"; String LIST_DELETE = "listDelete"; String LISTITEM_UPDATE = "listItemUpdate"; String COMMENT_UPDATE = "commentUpdate"; } interface Trigger { String SEASONS_UPDATE_WATCHED = "UPDATE " + Tables.SEASONS + " SET " + SeasonColumns.WATCHED_COUNT + "=(SELECT COUNT(*) FROM " + Tables.EPISODES + " WHERE " + Tables.EPISODES + "." + EpisodeColumns.SEASON_ID + "=NEW." + EpisodeColumns.SEASON_ID + " AND " + Tables.EPISODES + "." + EpisodeColumns.WATCHED + "=1" + " AND episodes.needsSync=0" + " AND " + Tables.EPISODES + "." + EpisodeColumns.SEASON + ">0)" + " WHERE " + Tables.SEASONS + "." + SeasonColumns.ID + "=NEW." + EpisodeColumns.SEASON_ID + ";"; String SEASONS_UPDATE_COLLECTED = "UPDATE " + Tables.SEASONS + " SET " + SeasonColumns.IN_COLLECTION_COUNT + "=(SELECT COUNT(*) FROM " + Tables.EPISODES + " WHERE " + Tables.EPISODES + "." + EpisodeColumns.SEASON_ID + "=NEW." + EpisodeColumns.SEASON_ID + " AND " + Tables.EPISODES + "." + EpisodeColumns.IN_COLLECTION + "=1" + " AND episodes.needsSync=0" + " AND " + Tables.EPISODES + "." + EpisodeColumns.SEASON + ">0)" + " WHERE " + Tables.SEASONS + "." + SeasonColumns.ID + "=NEW." + EpisodeColumns.SEASON_ID + ";"; String SEASONS_UPDATE_AIRDATE = "UPDATE " + Tables.SEASONS + " SET " + SeasonColumns.AIRDATE_COUNT + "=(SELECT COUNT(*) FROM " + Tables.EPISODES + " WHERE " + Tables.EPISODES + "." + EpisodeColumns.SEASON_ID + "=NEW." + EpisodeColumns.SEASON_ID + " AND " + Tables.EPISODES + "." + EpisodeColumns.FIRST_AIRED + " IS NOT NULL " + " AND episodes.needsSync=0" + " AND " + Tables.EPISODES + "." + EpisodeColumns.SEASON + ">0)" + " WHERE " + Tables.SEASONS + "." + SeasonColumns.ID + "=NEW." + EpisodeColumns.SEASON_ID + ";"; String SHOWS_UPDATE_WATCHED = "UPDATE " + Tables.SHOWS + " SET " + ShowColumns.WATCHED_COUNT + "=(SELECT COUNT(*) FROM " + Tables.EPISODES + " WHERE " + Tables.EPISODES + "." + EpisodeColumns.SHOW_ID + "=NEW." + EpisodeColumns.SHOW_ID + " AND " + Tables.EPISODES + "." + EpisodeColumns.WATCHED + "=1" + " AND episodes.needsSync=0" + " AND " + Tables.EPISODES + "." + EpisodeColumns.SEASON + ">0)" + " WHERE " + Tables.SHOWS + "." + ShowColumns.ID + "=NEW." + EpisodeColumns.SHOW_ID + ";"; String SHOWS_UPDATE_COLLECTED = "UPDATE " + Tables.SHOWS + " SET " + ShowColumns.IN_COLLECTION_COUNT + "=(SELECT COUNT(*) FROM " + Tables.EPISODES + " WHERE " + Tables.EPISODES + "." + EpisodeColumns.SHOW_ID + "=NEW." + EpisodeColumns.SHOW_ID + " AND " + Tables.EPISODES + "." + EpisodeColumns.IN_COLLECTION + "=1" + " AND episodes.needsSync=0" + " AND " + Tables.EPISODES + "." + EpisodeColumns.SEASON + ">0)" + " WHERE " + Tables.SHOWS + "." + ShowColumns.ID + "=NEW." + EpisodeColumns.SHOW_ID + ";"; String SHOWS_UPDATE_AIRDATE = "UPDATE " + Tables.SHOWS + " SET " + ShowColumns.AIRDATE_COUNT + "=(SELECT COUNT(*) FROM " + Tables.EPISODES + " WHERE " + Tables.EPISODES + "." + EpisodeColumns.SHOW_ID + "=NEW." + EpisodeColumns.SHOW_ID + " AND " + Tables.EPISODES + "." + EpisodeColumns.FIRST_AIRED + " IS NOT NULL " + " AND episodes.needsSync=0" + " AND " + Tables.EPISODES + "." + EpisodeColumns.SEASON + ">0)" + " WHERE " + Tables.SHOWS + "." + ShowColumns.ID + "=NEW." + EpisodeColumns.SHOW_ID + ";"; String SHOWS_UPDATE_WATCHING = "UPDATE " + Tables.SHOWS + " SET " + ShowColumns.WATCHING + "=(SELECT COUNT(*) FROM " + Tables.EPISODES + " WHERE " + Tables.EPISODES + "." + EpisodeColumns.SHOW_ID + "=NEW." + EpisodeColumns.SHOW_ID + " AND " + "(" + Tables.EPISODES + "." + EpisodeColumns.WATCHING + "=1" + " OR " + Tables.EPISODES + "." + EpisodeColumns.CHECKED_IN + "=1" + ")" + " AND " + Tables.EPISODES + "." + EpisodeColumns.NEEDS_SYNC + "=0" + " AND " + Tables.EPISODES + "." + EpisodeColumns.SEASON + ">0" + ")" + " WHERE " + Tables.SHOWS + "." + ShowColumns.ID + "=NEW." + EpisodeColumns.SHOW_ID + ";"; String SHOW_DELETE_SEASONS = "DELETE FROM " + Tables.SEASONS + " WHERE " + Tables.SEASONS + "." + SeasonColumns.SHOW_ID + "=OLD." + ShowColumns.ID + ";"; String SHOW_DELETE_GENRES = "DELETE FROM " + Tables.SHOW_GENRES + " WHERE " + Tables.SHOW_GENRES + "." + ShowGenreColumns.SHOW_ID + "=OLD." + ShowColumns.ID + ";"; String SHOW_DELETE_CAST = "DELETE FROM " + Tables.SHOW_CAST + " WHERE " + Tables.SHOW_CAST + "." + ShowCastColumns.SHOW_ID + "=OLD." + ShowColumns.ID + ";"; String SHOW_DELETE_CREW = "DELETE FROM " + Tables.SHOW_CREW + " WHERE " + Tables.SHOW_CREW + "." + ShowCrewColumns.SHOW_ID + "=OLD." + ShowColumns.ID + ";"; String SHOW_DELETE_COMMENTS = "DELETE FROM " + Tables.COMMENTS + " WHERE " + Tables.COMMENTS + "." + CommentColumns.ITEM_TYPE + "=" + DatabaseContract.ItemType.SHOW + " AND " + Tables.COMMENTS + "." + CommentColumns.ITEM_ID + "=OLD." + ShowColumns.ID + ";"; String SHOW_DELETE_RELATED = "DELETE FROM " + Tables.SHOW_RELATED + " WHERE " + Tables.SHOW_RELATED + "." + RelatedShowsColumns.SHOW_ID + "=OLD." + ShowColumns.ID + ";"; String SEASON_DELETE_EPISODES = "DELETE FROM " + Tables.EPISODES + " WHERE " + Tables.EPISODES + "." + EpisodeColumns.SEASON_ID + "=OLD." + SeasonColumns.ID + ";"; String EPISODE_DELETE_COMMENTS = "DELETE FROM " + Tables.COMMENTS + " WHERE " + Tables.COMMENTS + "." + CommentColumns.ITEM_TYPE + "=" + DatabaseContract.ItemType.EPISODE + " AND " + Tables.COMMENTS + "." + CommentColumns.ITEM_ID + "=OLD." + EpisodeColumns.ID + ";"; String MOVIE_DELETE_GENRES = "DELETE FROM " + Tables.MOVIE_GENRES + " WHERE " + Tables.MOVIE_GENRES + "." + MovieGenreColumns.MOVIE_ID + "=OLD." + MovieColumns.ID + ";"; String MOVIE_DELETE_CAST = "DELETE FROM " + Tables.MOVIE_CAST + " WHERE " + Tables.MOVIE_CAST + "." + MovieCastColumns.MOVIE_ID + "=OLD." + MovieColumns.ID + ";"; String MOVIE_DELETE_CREW = "DELETE FROM " + Tables.MOVIE_CREW + " WHERE " + Tables.MOVIE_CREW + "." + MovieCrewColumns.MOVIE_ID + "=OLD." + MovieColumns.ID + ";"; String MOVIE_DELETE_COMMENTS = "DELETE FROM " + Tables.COMMENTS + " WHERE " + Tables.COMMENTS + "." + CommentColumns.ITEM_TYPE + "=" + DatabaseContract.ItemType.MOVIE + " AND " + Tables.COMMENTS + "." + CommentColumns.ITEM_ID + "=OLD." + MovieColumns.ID + ";"; String MOVIE_DELETE_RELATED = "DELETE FROM " + Tables.MOVIE_RELATED + " WHERE " + Tables.MOVIE_RELATED + "." + RelatedMoviesColumns.MOVIE_ID + "=OLD." + MovieColumns.ID + ";"; String TIME_MILLIS = "(strftime('%s','now') * 1000 + cast(substr(strftime('%f','now'),4,3) AS INTEGER))"; String SHOW_UPDATE = "UPDATE " + Tables.SHOWS + " SET " + ShowColumns.LAST_MODIFIED + "=" + TIME_MILLIS + " WHERE " + ShowColumns.ID + "=old." + ShowColumns.ID + ";"; String SEASON_UPDATE = "UPDATE " + Tables.SEASONS + " SET " + SeasonColumns.LAST_MODIFIED + "=" + TIME_MILLIS + " WHERE " + SeasonColumns.ID + "=old." + SeasonColumns.ID + ";"; String EPISODE_UPDATE = "UPDATE " + Tables.EPISODES + " SET " + EpisodeColumns.LAST_MODIFIED + "=" + TIME_MILLIS + " WHERE " + EpisodeColumns.ID + "=old." + EpisodeColumns.ID + ";"; String MOVIES_UPDATE = "UPDATE " + Tables.MOVIES + " SET " + MovieColumns.LAST_MODIFIED + "=" + TIME_MILLIS + " WHERE " + MovieColumns.ID + "=old." + MovieColumns.ID + ";"; String PEOPLE_UPDATE = "UPDATE " + Tables.PEOPLE + " SET " + PersonColumns.LAST_MODIFIED + "=" + TIME_MILLIS + " WHERE " + PersonColumns.ID + "=old." + PersonColumns.ID + ";"; String LIST_DELETE = "DELETE FROM " + Tables.LIST_ITEMS + " WHERE " + Tables.LIST_ITEMS + "." + ListItemColumns.LIST_ID + "=OLD." + ListsColumns.ID + ";"; String LISTS_UPDATE = "UPDATE " + Tables.LISTS + " SET " + ListsColumns.LAST_MODIFIED + "=" + TIME_MILLIS + " WHERE " + ListsColumns.ID + "=old." + ListsColumns.ID + ";"; String LISTITEM_UPDATE = "UPDATE " + Tables.LIST_ITEMS + " SET " + ListItemColumns.LAST_MODIFIED + "=" + TIME_MILLIS + " WHERE " + ListItemColumns.ID + "=old." + ListItemColumns.ID + ";"; String COMMENT_UPDATE = "UPDATE " + Tables.COMMENTS + " SET " + CommentColumns.LAST_MODIFIED + "=" + TIME_MILLIS + " WHERE " + CommentColumns.ID + "=old." + CommentColumns.ID + ";"; } @ExecOnCreate public static final String TRIGGER_EPISODE_UPDATE_AIRED = "CREATE TRIGGER IF NOT EXISTS " + TriggerName.EPISODE_UPDATE_AIRED + " AFTER UPDATE OF " + EpisodeColumns.FIRST_AIRED + "," + EpisodeColumns.NEEDS_SYNC + " ON " + Tables.EPISODES + " BEGIN " + Trigger.SEASONS_UPDATE_AIRDATE + Trigger.SHOWS_UPDATE_AIRDATE + " END;"; @ExecOnCreate public static final String TRIGGER_EPISODE_UPDATE_WATCHED = "CREATE TRIGGER IF NOT EXISTS " + TriggerName.EPISODE_UPDATE_WATCHED + " AFTER UPDATE OF " + EpisodeColumns.WATCHED + "," + EpisodeColumns.NEEDS_SYNC + " ON " + Tables.EPISODES + " BEGIN " + Trigger.SEASONS_UPDATE_WATCHED + Trigger.SHOWS_UPDATE_WATCHED + " END;"; @ExecOnCreate public static final String TRIGGER_EPISODE_UPDATE_COLLECTED = "CREATE TRIGGER IF NOT EXISTS " + TriggerName.EPISODE_UPDATE_COLLECTED + " AFTER UPDATE OF " + EpisodeColumns.IN_COLLECTION + "," + EpisodeColumns.NEEDS_SYNC + " ON " + Tables.EPISODES + " BEGIN " + Trigger.SEASONS_UPDATE_COLLECTED + Trigger.SHOWS_UPDATE_COLLECTED + " END;"; @ExecOnCreate public static final String TRIGGER_EPISODE_UPDATE_WATCHING = "CREATE TRIGGER IF NOT EXISTS " + TriggerName.EPISODE_UPDATE_WATCHING + " AFTER UPDATE OF " + EpisodeColumns.WATCHING + "," + EpisodeColumns.CHECKED_IN + " ON " + Tables.EPISODES + " BEGIN " + Trigger.SHOWS_UPDATE_WATCHING + " END;"; @ExecOnCreate public static final String TRIGGER_EPISODE_INSERT = "CREATE TRIGGER IF NOT EXISTS " + TriggerName.EPISODE_INSERT + " AFTER INSERT ON " + Tables.EPISODES + " BEGIN " + Trigger.SEASONS_UPDATE_WATCHED + Trigger.SEASONS_UPDATE_AIRDATE + Trigger.SEASONS_UPDATE_COLLECTED + Trigger.SHOWS_UPDATE_WATCHED + Trigger.SHOWS_UPDATE_AIRDATE + Trigger.SHOWS_UPDATE_COLLECTED + " END;"; @ExecOnCreate public static final String TRIGGER_SHOW_DELETE = "CREATE TRIGGER IF NOT EXISTS " + TriggerName.SHOW_DELETE + " AFTER DELETE ON " + Tables.SHOWS + " BEGIN " + Trigger.SHOW_DELETE_SEASONS + Trigger.SHOW_DELETE_GENRES + Trigger.SHOW_DELETE_CAST + Trigger.SHOW_DELETE_CREW + Trigger.SHOW_DELETE_COMMENTS + Trigger.SHOW_DELETE_RELATED + " END;"; @ExecOnCreate public static final String TRIGGER_SEASON_DELETE = "CREATE TRIGGER IF NOT EXISTS " + TriggerName.SEASON_DELETE + " AFTER DELETE ON " + Tables.SEASONS + " BEGIN " + Trigger.SEASON_DELETE_EPISODES + " END"; @ExecOnCreate public static final String TRIGGER_EPISODE_DELETE = "CREATE TRIGGER IF NOT EXISTS " + TriggerName.EPISODE_DELETE + " AFTER DELETE ON " + Tables.EPISODES + " BEGIN " + Trigger.EPISODE_DELETE_COMMENTS + " END"; @ExecOnCreate public static final String TRIGGER_MOVIE_DELETE = "CREATE TRIGGER IF NOT EXISTS " + TriggerName.MOVIE_DELETE + " AFTER DELETE ON " + Tables.MOVIES + " BEGIN " + Trigger.MOVIE_DELETE_GENRES + Trigger.MOVIE_DELETE_CAST + Trigger.MOVIE_DELETE_CREW + Trigger.MOVIE_DELETE_COMMENTS + Trigger.MOVIE_DELETE_RELATED + " END;"; @ExecOnCreate public static final String TRIGGER_SHOW_UPDATE = "CREATE TRIGGER IF NOT EXISTS " + TriggerName.SHOW_UPDATE + " AFTER UPDATE ON " + Tables.SHOWS + " FOR EACH ROW BEGIN " + Trigger.SHOW_UPDATE + " END"; @ExecOnCreate public static final String TRIGGER_SEASON_UPDATE = "CREATE TRIGGER IF NOT EXISTS " + TriggerName.SEASON_UPDATE + " AFTER UPDATE ON " + Tables.SEASONS + " FOR EACH ROW BEGIN " + Trigger.SEASON_UPDATE + " END"; @ExecOnCreate public static final String TRIGGER_EPISODE_UPDATE = "CREATE TRIGGER IF NOT EXISTS " + TriggerName.EPISODE_UPDATE + " AFTER UPDATE ON " + Tables.EPISODES + " FOR EACH ROW BEGIN " + Trigger.EPISODE_UPDATE + " END"; @ExecOnCreate public static final String TRIGGER_MOVIES_UPDATE = "CREATE TRIGGER IF NOT EXISTS " + TriggerName.MOVIES_UPDATE + " AFTER UPDATE ON " + Tables.MOVIES + " FOR EACH ROW BEGIN " + Trigger.MOVIES_UPDATE + " END"; @ExecOnCreate public static final String TRIGGER_PEOPLE_UPDATE = "CREATE TRIGGER IF NOT EXISTS " + TriggerName.PEOPLE_UPDATE + " AFTER UPDATE ON " + Tables.PEOPLE + " FOR EACH ROW BEGIN " + Trigger.PEOPLE_UPDATE + " END"; @ExecOnCreate public static final String TRIGGER_LIST_DELETE = "CREATE TRIGGER IF NOT EXISTS " + TriggerName.LIST_DELETE + " AFTER DELETE ON " + Tables.LISTS + " BEGIN " + Trigger.LIST_DELETE + " END;"; @ExecOnCreate public static final String TRIGGER_LIST_UPDATE = "CREATE TRIGGER IF NOT EXISTS " + TriggerName.LIST_UPDATE + " AFTER UPDATE ON " + Tables.LISTS + " FOR EACH ROW BEGIN " + Trigger.LISTS_UPDATE + " END"; @ExecOnCreate public static final String TRIGGER_LISTITEM_UPDATE = "CREATE TRIGGER IF NOT EXISTS " + TriggerName.LISTITEM_UPDATE + " AFTER UPDATE ON " + Tables.LIST_ITEMS + " FOR EACH ROW BEGIN " + Trigger.LISTITEM_UPDATE + " END"; @ExecOnCreate public static final String TRIGGER_COMMENT_UPDATE = "CREATE TRIGGER IF NOT EXISTS " + TriggerName.COMMENT_UPDATE + " AFTER UPDATE ON " + Tables.COMMENTS + " FOR EACH ROW BEGIN " + Trigger.COMMENT_UPDATE + " END"; @ExecOnCreate public static final String INDEX_CAST_SHOW_ID = SqlIndex.index("castShowId") .ifNotExists() .onTable(Tables.SHOW_CAST) .forColumns(ShowCastColumns.SHOW_ID) .build(); @ExecOnCreate public static final String INDEX_CREW_SHOW_ID = SqlIndex.index("crewShowId") .ifNotExists() .onTable(Tables.SHOW_CREW) .forColumns(ShowCrewColumns.SHOW_ID) .build(); @ExecOnCreate public static final String INDEX_RELATED_SHOW_ID = SqlIndex.index("relatedShowId") .ifNotExists() .onTable(Tables.SHOW_RELATED) .forColumns(RelatedShowsColumns.SHOW_ID) .build(); @ExecOnCreate public static final String INDEX_SEASON_SHOW_ID = SqlIndex.index("seasonShowId") .ifNotExists() .onTable(Tables.SEASONS) .forColumns(SeasonColumns.SHOW_ID) .build(); @ExecOnCreate public static final String INDEX_GENRE_SHOW_ID = SqlIndex.index("genreShowId") .ifNotExists() .onTable(Tables.SHOW_GENRES) .forColumns(ShowGenreColumns.SHOW_ID) .build(); @ExecOnCreate public static final String INDEX_CAST_MOVIE_ID = SqlIndex.index("castMovieId") .ifNotExists() .onTable(Tables.MOVIE_CAST) .forColumns(MovieCastColumns.MOVIE_ID) .build(); @ExecOnCreate public static final String INDEX_CREW_MOVIE_ID = SqlIndex.index("crewMovieId") .ifNotExists() .onTable(Tables.MOVIE_CREW) .forColumns(MovieCrewColumns.MOVIE_ID) .build(); @ExecOnCreate public static final String INDEX_RELATED_MOVIE_ID = SqlIndex.index("relatedMovieId") .ifNotExists() .onTable(Tables.MOVIE_RELATED) .forColumns(RelatedMoviesColumns.MOVIE_ID) .build(); @ExecOnCreate public static final String INDEX_GENRE_MOVIE_ID = SqlIndex.index("genreMovieId") .ifNotExists() .onTable(Tables.MOVIE_GENRES) .forColumns(MovieGenreColumns.MOVIE_ID) .build(); @ExecOnCreate public static final String INDEX_EPISODES_SHOW_ID = SqlIndex.index("episodesShowId") .ifNotExists() .onTable(Tables.EPISODES) .forColumns(EpisodeColumns.SHOW_ID) .build(); @ExecOnCreate public static final String INDEX_EPISODES_SEASON_ID = SqlIndex.index("episodesSeasonId") .ifNotExists() .onTable(Tables.EPISODES) .forColumns(EpisodeColumns.SEASON_ID) .build(); @OnUpgrade public static void onUpgrade(Context context, SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion < 12) { db.execSQL("DROP TABLE IF EXISTS shows"); db.execSQL("DROP TABLE IF EXISTS showTopWatchers"); db.execSQL("DROP TABLE IF EXISTS topEpisodes"); db.execSQL("DROP TABLE IF EXISTS showActors"); db.execSQL("DROP TABLE IF EXISTS showGenres"); db.execSQL("DROP TABLE IF EXISTS seasons"); db.execSQL("DROP TABLE IF EXISTS episodes"); db.execSQL("DROP TABLE IF EXISTS movies"); db.execSQL("DROP TABLE IF EXISTS movieGenres"); db.execSQL("DROP TABLE IF EXISTS movieTopWatchers"); db.execSQL("DROP TABLE IF EXISTS movieActors"); db.execSQL("DROP TABLE IF EXISTS movieDirectors"); db.execSQL("DROP TABLE IF EXISTS movieWriters"); db.execSQL("DROP TABLE IF EXISTS movieProducers"); db.execSQL("DROP TABLE IF EXISTS showSearchSuggestions"); db.execSQL("DROP TABLE IF EXISTS movieSearchSuggestions"); db.execSQL("DROP TRIGGER IF EXISTS episodeInsert"); db.execSQL("DROP TRIGGER IF EXISTS episodeUpdateAired"); db.execSQL("DROP TRIGGER IF EXISTS episodeUpdateWatched"); db.execSQL("DROP TRIGGER IF EXISTS episodeUpdateCollected"); } if (oldVersion < 13) { CathodeDatabase.getInstance(context).onCreate(db); SqlUtils.createColumnIfNotExists(db, Tables.SHOWS, LastModifiedColumns.LAST_MODIFIED, DataType.Type.INTEGER, "0"); SqlUtils.createColumnIfNotExists(db, Tables.SEASONS, LastModifiedColumns.LAST_MODIFIED, DataType.Type.INTEGER, "0"); SqlUtils.createColumnIfNotExists(db, Tables.EPISODES, LastModifiedColumns.LAST_MODIFIED, DataType.Type.INTEGER, "0"); SqlUtils.createColumnIfNotExists(db, Tables.SHOW_CAST, LastModifiedColumns.LAST_MODIFIED, DataType.Type.INTEGER, "0"); SqlUtils.createColumnIfNotExists(db, Tables.MOVIES, LastModifiedColumns.LAST_MODIFIED, DataType.Type.INTEGER, "0"); SqlUtils.createColumnIfNotExists(db, Tables.MOVIE_CAST, LastModifiedColumns.LAST_MODIFIED, DataType.Type.INTEGER, "0"); SqlUtils.createColumnIfNotExists(db, Tables.MOVIE_CREW, LastModifiedColumns.LAST_MODIFIED, DataType.Type.INTEGER, "0"); SqlUtils.createColumnIfNotExists(db, Tables.PEOPLE, LastModifiedColumns.LAST_MODIFIED, DataType.Type.INTEGER, "0"); } if (oldVersion < 14) { db.execSQL(CathodeDatabase.LISTS); db.execSQL(CathodeDatabase.LIST_ITEMS); } if (oldVersion < 16) { Set<String> showColumns = SqlUtils.columns(db, Tables.SHOWS); if (!showColumns.contains(ShowColumns.HIDDEN_CALENDAR)) { db.execSQL("ALTER TABLE " + Tables.SHOWS + " ADD COLUMN " + ShowColumns.HIDDEN_CALENDAR + " INTEGER DEFAULT 0"); } if (!showColumns.contains(ShowColumns.HIDDEN_COLLECTED)) { db.execSQL("ALTER TABLE " + Tables.SHOWS + " ADD COLUMN " + ShowColumns.HIDDEN_COLLECTED + " INTEGER DEFAULT 0"); } if (!showColumns.contains(ShowColumns.HIDDEN_WATCHED)) { db.execSQL("ALTER TABLE " + Tables.SHOWS + " ADD COLUMN " + ShowColumns.HIDDEN_WATCHED + " INTEGER DEFAULT 0"); } if (!showColumns.contains(ShowColumns.HIDDEN_RECOMMENDATIONS)) { db.execSQL( "ALTER TABLE " + Tables.SHOWS + " ADD COLUMN " + ShowColumns.HIDDEN_RECOMMENDATIONS + " INTEGER DEFAULT 0"); } Set<String> seasonColumns = SqlUtils.columns(db, Tables.SEASONS); if (!seasonColumns.contains(SeasonColumns.HIDDEN_COLLECTED)) { db.execSQL("ALTER TABLE " + Tables.SEASONS + " ADD COLUMN " + SeasonColumns.HIDDEN_COLLECTED + " INTEGER DEFAULT 0"); } if (!seasonColumns.contains(SeasonColumns.HIDDEN_WATCHED)) { db.execSQL("ALTER TABLE " + Tables.SEASONS + " ADD COLUMN " + SeasonColumns.HIDDEN_WATCHED + " INTEGER DEFAULT 0"); } Set<String> movieColumns = SqlUtils.columns(db, Tables.MOVIES); if (!movieColumns.contains(MovieColumns.HIDDEN_CALENDAR)) { db.execSQL("ALTER TABLE " + Tables.MOVIES + " ADD COLUMN " + MovieColumns.HIDDEN_CALENDAR + " INTEGER DEFAULT 0"); } if (!movieColumns.contains(MovieColumns.HIDDEN_RECOMMENDATIONS)) { db.execSQL( "ALTER TABLE " + Tables.MOVIES + " ADD COLUMN " + MovieColumns.HIDDEN_RECOMMENDATIONS + " INTEGER DEFAULT 0"); } } if (oldVersion < 18) { db.execSQL(CathodeDatabase.COMMENTS); db.execSQL(CathodeDatabase.USERS); } if (oldVersion < 19) { Set<String> showColumns = SqlUtils.columns(db, Tables.SHOWS); if (!showColumns.contains(ShowColumns.LAST_COMMENT_SYNC)) { db.execSQL("ALTER TABLE " + Tables.SHOWS + " ADD COLUMN " + ShowColumns.LAST_COMMENT_SYNC + " INTEGER DEFAULT 0"); } } if (oldVersion < 20) { Set<String> movieColumns = SqlUtils.columns(db, Tables.MOVIES); if (!movieColumns.contains(MovieColumns.LAST_COMMENT_SYNC)) { db.execSQL("ALTER TABLE " + Tables.MOVIES + " ADD COLUMN " + MovieColumns.LAST_COMMENT_SYNC + " INTEGER DEFAULT 0"); } } if (oldVersion < 21) { SqlUtils.createColumnIfNotExists(db, Tables.SHOWS, ShowColumns.LAST_SYNC, DataType.Type.INTEGER, "0"); SqlUtils.createColumnIfNotExists(db, Tables.SHOWS, ShowColumns.LAST_CREDITS_SYNC, DataType.Type.INTEGER, "0"); SqlUtils.createColumnIfNotExists(db, Tables.MOVIES, MovieColumns.LAST_SYNC, DataType.Type.INTEGER, "0"); SqlUtils.createColumnIfNotExists(db, Tables.MOVIES, MovieColumns.LAST_CREDITS_SYNC, DataType.Type.INTEGER, "0"); final long currentTime = System.currentTimeMillis(); ContentValues values = new ContentValues(); values.put(ShowColumns.LAST_SYNC, currentTime); values.put(ShowColumns.LAST_CREDITS_SYNC, currentTime); db.update(Tables.SHOWS, values, null, null); values = new ContentValues(); values.put(MovieColumns.LAST_SYNC, currentTime); values.put(MovieColumns.LAST_CREDITS_SYNC, currentTime); db.update(Tables.MOVIES, values, null, null); } if (oldVersion < 22) { SqlUtils.createColumnIfNotExists(db, Tables.SHOWS, ShowColumns.ANTICIPATED_INDEX, DataType.Type.INTEGER, "-1"); SqlUtils.createColumnIfNotExists(db, Tables.MOVIES, MovieColumns.ANTICIPATED_INDEX, DataType.Type.INTEGER, "-1"); } if (oldVersion < 23) { SqlUtils.createColumnIfNotExists(db, Tables.EPISODES, EpisodeColumns.LAST_COMMENT_SYNC, DataType.Type.INTEGER, "0"); } if (oldVersion < 24) { SqlUtils.createColumnIfNotExists(db, Tables.SHOWS, ShowColumns.WATCHING, DataType.Type.INTEGER, "0"); db.execSQL(TRIGGER_EPISODE_UPDATE_WATCHING); } if (oldVersion < 25) { db.execSQL("DROP TABLE IF EXISTS showSearchSuggestions"); db.execSQL("DROP TABLE IF EXISTS movieSearchSuggestions"); db.execSQL(CathodeDatabase.RECENT_QUERIES); } if (oldVersion < 26) { db.execSQL(CathodeDatabase.SHOW_RELATED); db.execSQL(CathodeDatabase.MOVIE_RELATED); } if (oldVersion < 27) { SqlUtils.createColumnIfNotExists(db, Tables.SHOWS, ShowColumns.LAST_RELATED_SYNC, DataType.Type.INTEGER, "0"); SqlUtils.createColumnIfNotExists(db, Tables.MOVIES, MovieColumns.LAST_RELATED_SYNC, DataType.Type.INTEGER, "0"); } if (oldVersion < 28) { db.execSQL("DROP TABLE IF EXISTS showCharacters"); db.execSQL(CathodeDatabase.SHOW_CAST); db.execSQL(CathodeDatabase.SHOW_CREW); } if (oldVersion < 29) { SqlUtils.createColumnIfNotExists(db, Tables.PEOPLE, PersonColumns.SCREENSHOT, DataType.Type.TEXT, null); } if (oldVersion < 30) { SqlUtils.createColumnIfNotExists(db, Tables.PEOPLE, PersonColumns.LAST_SYNC, DataType.Type.INTEGER, "0"); } if (oldVersion < 31) { SqlUtils.createColumnIfNotExists(db, Tables.SHOWS, ShowColumns.LAST_CREDITS_SYNC, DataType.Type.INTEGER, "0"); SqlUtils.createColumnIfNotExists(db, Tables.MOVIES, MovieColumns.LAST_CREDITS_SYNC, DataType.Type.INTEGER, "0"); } if (oldVersion < 32) { SqlUtils.createColumnIfNotExists(db, Tables.EPISODES, EpisodeColumns.IMAGES_LAST_SYNC, DataType.Type.INTEGER, "0"); SqlUtils.createColumnIfNotExists(db, Tables.PEOPLE, PersonColumns.IMAGES_LAST_SYNC, DataType.Type.INTEGER, "0"); } if (oldVersion < 33) { SqlUtils.createColumnIfNotExists(db, Tables.SHOWS, ShowColumns.IMAGES_LAST_SYNC, DataType.Type.INTEGER, "0"); SqlUtils.createColumnIfNotExists(db, Tables.MOVIE_CAST, MovieColumns.IMAGES_LAST_SYNC, DataType.Type.INTEGER, "0"); } if (oldVersion < 34) { SqlUtils.createColumnIfNotExists(db, Tables.SHOWS, ShowColumns.BACKDROP, DataType.Type.TEXT, null); SqlUtils.createColumnIfNotExists(db, Tables.MOVIES, MovieColumns.BACKDROP, DataType.Type.TEXT, null); SqlUtils.createColumnIfNotExists(db, Tables.PEOPLE, PersonColumns.SCREENSHOT, DataType.Type.TEXT, null); } if (oldVersion < 35) { ContentValues showValues = new ContentValues(); showValues.putNull(ShowColumns.BACKDROP); showValues.putNull(ShowColumns.POSTER); db.update(Tables.SHOWS, showValues, null, null); ContentValues episodeValues = new ContentValues(); episodeValues.putNull(EpisodeColumns.SCREENSHOT); db.update(Tables.EPISODES, episodeValues, null, null); ContentValues movieValues = new ContentValues(); movieValues.putNull(MovieColumns.BACKDROP); movieValues.putNull(MovieColumns.POSTER); db.update(Tables.MOVIES, movieValues, null, null); ContentValues personValues = new ContentValues(); personValues.putNull(PersonColumns.SCREENSHOT); personValues.putNull(PersonColumns.HEADSHOT); db.update(Tables.PEOPLE, personValues, null, null); } if (oldVersion < 36) { db.execSQL("DROP TRIGGER IF EXISTS showDelete"); db.execSQL("DROP TRIGGER IF EXISTS movieDelete"); db.execSQL(TRIGGER_EPISODE_UPDATE_AIRED); db.execSQL(TRIGGER_EPISODE_UPDATE_WATCHED); db.execSQL(TRIGGER_EPISODE_UPDATE_COLLECTED); db.execSQL(TRIGGER_EPISODE_UPDATE_WATCHING); db.execSQL(TRIGGER_EPISODE_INSERT); db.execSQL(TRIGGER_SHOW_DELETE); db.execSQL(TRIGGER_SEASON_DELETE); db.execSQL(TRIGGER_EPISODE_DELETE); db.execSQL(TRIGGER_MOVIE_DELETE); db.execSQL(TRIGGER_SHOW_UPDATE); db.execSQL(TRIGGER_SEASON_UPDATE); db.execSQL(TRIGGER_EPISODE_UPDATE); db.execSQL(TRIGGER_MOVIES_UPDATE); db.execSQL(TRIGGER_PEOPLE_UPDATE); db.execSQL(TRIGGER_LIST_DELETE); db.execSQL(TRIGGER_LIST_UPDATE); db.execSQL(TRIGGER_LISTITEM_UPDATE); db.execSQL(TRIGGER_COMMENT_UPDATE); db.execSQL("DROP INDEX IF EXISTS characterShowId"); db.execSQL(INDEX_CAST_SHOW_ID); db.execSQL(INDEX_CREW_SHOW_ID); db.execSQL(INDEX_RELATED_SHOW_ID); db.execSQL(INDEX_SEASON_SHOW_ID); db.execSQL(INDEX_GENRE_SHOW_ID); db.execSQL(INDEX_CAST_MOVIE_ID); db.execSQL(INDEX_CREW_MOVIE_ID); db.execSQL(INDEX_RELATED_MOVIE_ID); db.execSQL(INDEX_GENRE_MOVIE_ID); db.execSQL(INDEX_EPISODES_SHOW_ID); db.execSQL(INDEX_EPISODES_SEASON_ID); } if (oldVersion < 37) { SqlUtils.createColumnIfNotExists(db, Tables.EPISODES, EpisodeColumns.NOTIFICATION_DISMISSED, DataType.Type.INTEGER, "0"); } } }