diff --git a/tv-provider/src/android/support/media/tv/BasePreviewProgram.java b/tv-provider/src/android/support/media/tv/BasePreviewProgram.java
index 35d2a03..d9aaf82 100644
--- a/tv-provider/src/android/support/media/tv/BasePreviewProgram.java
+++ b/tv-provider/src/android/support/media/tv/BasePreviewProgram.java
@@ -22,6 +22,7 @@
 import android.content.Intent;
 import android.database.Cursor;
 import android.net.Uri;
+import android.os.Build;
 import android.support.annotation.RestrictTo;
 import android.support.media.tv.TvContractCompat.PreviewProgramColumns;
 import android.support.media.tv.TvContractCompat.PreviewProgramColumns.AspectRatio;
@@ -29,13 +30,10 @@
 import android.support.media.tv.TvContractCompat.PreviewProgramColumns.InteractionType;
 import android.support.media.tv.TvContractCompat.PreviewProgramColumns.Type;
 import android.support.media.tv.TvContractCompat.PreviewPrograms;
-import android.support.v4.os.BuildCompat;
-import android.text.TextUtils;
 
 import java.net.URISyntaxException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
-import java.util.Objects;
 import java.util.TimeZone;
 
 /**
@@ -55,51 +53,8 @@
     private static final int IS_LIVE = 1;
     private static final int IS_BROWSABLE = 1;
 
-    private final String mInternalProviderId;
-    private final Uri mPreviewVideoUri;
-    private final int mLastPlaybackPositionMillis;
-    private final int mDurationMillis;
-    private final Uri mIntentUri;
-    private final int mTransient;
-    private final int mType;
-    private final int mPosterArtAspectRatio;
-    private final int mThumbnailAspectRatio;
-    private final Uri mLogoUri;
-    private final int mAvailability;
-    private final String mStartingPrice;
-    private final String mOfferPrice;
-    private final String mReleaseDate;
-    private final int mItemCount;
-    private final int mLive;
-    private final int mInteractionType;
-    private final long mInteractionCount;
-    private final String mAuthor;
-    private final int mBrowsable;
-    private final String mContentId;
-
     BasePreviewProgram(Builder builder) {
         super(builder);
-        mInternalProviderId = builder.mExternalId;
-        mPreviewVideoUri = builder.mPreviewVideoUri;
-        mLastPlaybackPositionMillis = builder.mLastPlaybackPositionMillis;
-        mDurationMillis = builder.mDurationMillis;
-        mIntentUri = builder.mIntentUri;
-        mTransient = builder.mTransient;
-        mType = builder.mType;
-        mPosterArtAspectRatio = builder.mPosterArtAspectRatio;
-        mThumbnailAspectRatio = builder.mThumbnailAspectRatio;
-        mLogoUri = builder.mLogoUri;
-        mAvailability = builder.mAvailability;
-        mStartingPrice = builder.mStartingPrice;
-        mOfferPrice = builder.mOfferPrice;
-        mReleaseDate = builder.mReleaseDate;
-        mItemCount = builder.mItemCount;
-        mLive = builder.mLive;
-        mInteractionType = builder.mInteractionType;
-        mInteractionCount = builder.mInteractionCount;
-        mAuthor = builder.mAuthor;
-        mBrowsable = builder.mBrowsable;
-        mContentId = builder.mContentId;
     }
 
     /**
@@ -107,7 +62,7 @@
      * @see PreviewPrograms#COLUMN_INTERNAL_PROVIDER_ID
      */
     public String getInternalProviderId() {
-        return mInternalProviderId;
+        return mValues.getAsString(PreviewPrograms.COLUMN_INTERNAL_PROVIDER_ID);
     }
 
     /**
@@ -115,7 +70,8 @@
      * @see PreviewPrograms#COLUMN_PREVIEW_VIDEO_URI
      */
     public Uri getPreviewVideoUri() {
-        return mPreviewVideoUri;
+        String uri = mValues.getAsString(PreviewPrograms.COLUMN_PREVIEW_VIDEO_URI);
+        return uri == null ? null : Uri.parse(uri);
     }
 
     /**
@@ -123,7 +79,8 @@
      * @see PreviewPrograms#COLUMN_LAST_PLAYBACK_POSITION_MILLIS
      */
     public int getLastPlaybackPositionMillis() {
-        return mLastPlaybackPositionMillis;
+        Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_LAST_PLAYBACK_POSITION_MILLIS);
+        return i == null ? INVALID_INT_VALUE : i;
     }
 
     /**
@@ -131,7 +88,8 @@
      * @see PreviewPrograms#COLUMN_DURATION_MILLIS
      */
     public int getDurationMillis() {
-        return mDurationMillis;
+        Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_DURATION_MILLIS);
+        return i == null ? INVALID_INT_VALUE : i;
     }
 
     /**
@@ -139,7 +97,8 @@
      * @see PreviewPrograms#COLUMN_INTENT_URI
      */
     public Uri getIntentUri() {
-        return mIntentUri;
+        String uri = mValues.getAsString(PreviewPrograms.COLUMN_INTENT_URI);
+        return uri == null ? null : Uri.parse(uri);
     }
 
     /**
@@ -147,7 +106,8 @@
      * @see PreviewPrograms#COLUMN_INTENT_URI
      */
     public Intent getIntent() throws URISyntaxException {
-        return Intent.parseUri(mIntentUri.toString(), Intent.URI_INTENT_SCHEME);
+        String uri = mValues.getAsString(PreviewPrograms.COLUMN_INTENT_URI);
+        return uri == null ? null : Intent.parseUri(uri, Intent.URI_INTENT_SCHEME);
     }
 
     /**
@@ -155,7 +115,8 @@
      * @see PreviewPrograms#COLUMN_TRANSIENT
      */
     public boolean isTransient() {
-        return mTransient == IS_TRANSIENT;
+        Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_TRANSIENT);
+        return i != null && i == IS_TRANSIENT;
     }
 
     /**
@@ -163,7 +124,8 @@
      * @see PreviewPrograms#COLUMN_TYPE
      */
     public @Type int getType() {
-        return mType;
+        Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_TYPE);
+        return i == null ? INVALID_INT_VALUE : i;
     }
 
     /**
@@ -172,7 +134,8 @@
      * @see PreviewPrograms#COLUMN_POSTER_ART_URI
      */
     public @AspectRatio int getPosterArtAspectRatio() {
-        return mPosterArtAspectRatio;
+        Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_POSTER_ART_ASPECT_RATIO);
+        return i == null ? INVALID_INT_VALUE : i;
     }
 
     /**
@@ -181,7 +144,8 @@
      * @see PreviewPrograms#COLUMN_THUMBNAIL_URI
      */
     public @AspectRatio int getThumbnailAspectRatio() {
-        return mThumbnailAspectRatio;
+        Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_THUMBNAIL_ASPECT_RATIO);
+        return i == null ? INVALID_INT_VALUE : i;
     }
 
     /**
@@ -189,7 +153,8 @@
      * @see PreviewPrograms#COLUMN_LOGO_URI
      */
     public Uri getLogoUri() {
-        return mLogoUri;
+        String uri = mValues.getAsString(PreviewPrograms.COLUMN_LOGO_URI);
+        return uri == null ? null : Uri.parse(uri);
     }
 
     /**
@@ -197,7 +162,8 @@
      * @see PreviewPrograms#COLUMN_AVAILABILITY
      */
     public @Availability int getAvailability() {
-        return mAvailability;
+        Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_AVAILABILITY);
+        return i == null ? INVALID_INT_VALUE : i;
     }
 
     /**
@@ -205,7 +171,7 @@
      * @see PreviewPrograms#COLUMN_STARTING_PRICE
      */
     public String getStartingPrice() {
-        return mStartingPrice;
+        return mValues.getAsString(PreviewPrograms.COLUMN_STARTING_PRICE);
     }
 
     /**
@@ -213,7 +179,7 @@
      * @see PreviewPrograms#COLUMN_OFFER_PRICE
      */
     public String getOfferPrice() {
-        return mOfferPrice;
+        return mValues.getAsString(PreviewPrograms.COLUMN_OFFER_PRICE);
     }
 
     /**
@@ -221,7 +187,7 @@
      * @see PreviewPrograms#COLUMN_RELEASE_DATE
      */
     public String getReleaseDate() {
-        return mReleaseDate;
+        return mValues.getAsString(PreviewPrograms.COLUMN_RELEASE_DATE);
     }
 
     /**
@@ -229,7 +195,8 @@
      * @see PreviewPrograms#COLUMN_ITEM_COUNT
      */
     public int getItemCount() {
-        return mItemCount;
+        Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_ITEM_COUNT);
+        return i == null ? INVALID_INT_VALUE : i;
     }
 
     /**
@@ -237,7 +204,8 @@
      * @see PreviewPrograms#COLUMN_LIVE
      */
     public boolean isLive() {
-        return mLive == IS_LIVE;
+        Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_LIVE);
+        return i != null && i == IS_LIVE;
     }
 
     /**
@@ -245,7 +213,8 @@
      * @see PreviewPrograms#COLUMN_INTERACTION_TYPE
      */
     public @InteractionType int getInteractionType() {
-        return mInteractionType;
+        Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_INTERACTION_TYPE);
+        return i == null ? INVALID_INT_VALUE : i;
     }
 
     /**
@@ -253,7 +222,8 @@
      * @see PreviewPrograms#COLUMN_INTERACTION_COUNT
      */
     public long getInteractionCount() {
-        return mInteractionCount;
+        Long l = mValues.getAsLong(PreviewPrograms.COLUMN_INTERACTION_COUNT);
+        return l == null ? INVALID_LONG_VALUE : l;
     }
 
     /**
@@ -261,7 +231,7 @@
      * @see PreviewPrograms#COLUMN_AUTHOR
      */
     public String getAuthor() {
-        return mAuthor;
+        return mValues.getAsString(PreviewPrograms.COLUMN_AUTHOR);
     }
 
     /**
@@ -269,7 +239,8 @@
      * @see PreviewPrograms#COLUMN_BROWSABLE;
      */
     public boolean isBrowsable() {
-        return mBrowsable == IS_BROWSABLE;
+        Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_BROWSABLE);
+        return i != null && i == IS_BROWSABLE;
     }
 
     /**
@@ -277,7 +248,7 @@
      * @see PreviewPrograms#COLUMN_CONTENT_ID
      */
     public String getContentId() {
-        return mContentId;
+        return mValues.getAsString(PreviewPrograms.COLUMN_CONTENT_ID);
     }
 
     @Override
@@ -285,32 +256,7 @@
         if (!(other instanceof BasePreviewProgram)) {
             return false;
         }
-        if (!super.equals(other)) {
-            return false;
-        }
-        BasePreviewProgram program = (BasePreviewProgram) other;
-        return Objects.equals(mInternalProviderId, program.mInternalProviderId)
-                && Objects.equals(mPreviewVideoUri, program.mPreviewVideoUri)
-                && Objects.equals(mLastPlaybackPositionMillis,
-                program.mLastPlaybackPositionMillis)
-                && Objects.equals(mDurationMillis, program.mDurationMillis)
-                && Objects.equals(mIntentUri, program.mIntentUri)
-                && Objects.equals(mTransient, program.mTransient)
-                && Objects.equals(mType, program.mType)
-                && Objects.equals(mPosterArtAspectRatio, program.mPosterArtAspectRatio)
-                && Objects.equals(mThumbnailAspectRatio, program.mThumbnailAspectRatio)
-                && Objects.equals(mLogoUri, program.mLogoUri)
-                && Objects.equals(mAvailability, program.mAvailability)
-                && Objects.equals(mStartingPrice, program.mStartingPrice)
-                && Objects.equals(mOfferPrice, program.mOfferPrice)
-                && Objects.equals(mReleaseDate, program.mReleaseDate)
-                && Objects.equals(mItemCount, program.mItemCount)
-                && Objects.equals(mLive, program.mLive)
-                && Objects.equals(mInteractionType, program.mInteractionType)
-                && Objects.equals(mInteractionCount, program.mInteractionCount)
-                && Objects.equals(mAuthor, program.mAuthor)
-                && Objects.equals(mBrowsable, program.mBrowsable)
-                && Objects.equals(mContentId, program.mContentId);
+        return mValues.equals(((BasePreviewProgram) other).mValues);
     }
 
     /**
@@ -332,78 +278,29 @@
     @RestrictTo(LIBRARY_GROUP)
     public ContentValues toContentValues(boolean includeProtectedFields) {
         ContentValues values = super.toContentValues();
-        if (BuildCompat.isAtLeastO()) {
-            if (!TextUtils.isEmpty(mInternalProviderId)) {
-                values.put(PreviewProgramColumns.COLUMN_INTERNAL_PROVIDER_ID, mInternalProviderId);
-            }
-            if (mPreviewVideoUri != null) {
-                values.put(PreviewProgramColumns.COLUMN_PREVIEW_VIDEO_URI,
-                        mPreviewVideoUri.toString());
-            }
-            if (mLastPlaybackPositionMillis != INVALID_INT_VALUE) {
-                values.put(PreviewProgramColumns.COLUMN_LAST_PLAYBACK_POSITION_MILLIS,
-                        mLastPlaybackPositionMillis);
-            }
-            if (mDurationMillis != INVALID_INT_VALUE) {
-                values.put(PreviewProgramColumns.COLUMN_DURATION_MILLIS, mDurationMillis);
-            }
-            if (mIntentUri != null) {
-                values.put(PreviewProgramColumns.COLUMN_INTENT_URI, mIntentUri.toString());
-            }
-            if (mTransient != INVALID_INT_VALUE) {
-                values.put(PreviewProgramColumns.COLUMN_TRANSIENT, mTransient);
-            }
-            if (mType != INVALID_INT_VALUE) {
-                values.put(PreviewProgramColumns.COLUMN_TYPE, mType);
-            }
-            if (mPosterArtAspectRatio != INVALID_INT_VALUE) {
-                values.put(PreviewProgramColumns.COLUMN_POSTER_ART_ASPECT_RATIO,
-                        mPosterArtAspectRatio);
-            }
-            if (mThumbnailAspectRatio != INVALID_INT_VALUE) {
-                values.put(PreviewProgramColumns.COLUMN_THUMBNAIL_ASPECT_RATIO,
-                        mThumbnailAspectRatio);
-            }
-            if (mLogoUri != null) {
-                values.put(PreviewProgramColumns.COLUMN_LOGO_URI, mLogoUri.toString());
-            }
-            if (mAvailability != INVALID_INT_VALUE) {
-                values.put(PreviewProgramColumns.COLUMN_AVAILABILITY, mAvailability);
-            }
-            if (!TextUtils.isEmpty(mStartingPrice)) {
-                values.put(PreviewProgramColumns.COLUMN_STARTING_PRICE, mStartingPrice);
-            }
-            if (!TextUtils.isEmpty(mOfferPrice)) {
-                values.put(PreviewProgramColumns.COLUMN_OFFER_PRICE, mOfferPrice);
-            }
-            if (!TextUtils.isEmpty(mReleaseDate)) {
-                values.put(PreviewProgramColumns.COLUMN_RELEASE_DATE, mReleaseDate);
-            }
-            if (mItemCount != INVALID_INT_VALUE) {
-                values.put(PreviewProgramColumns.COLUMN_ITEM_COUNT, mItemCount);
-            }
-            if (mLive != INVALID_INT_VALUE) {
-                values.put(PreviewProgramColumns.COLUMN_LIVE, mLive);
-            }
-            if (mInteractionType != INVALID_INT_VALUE) {
-                values.put(PreviewProgramColumns.COLUMN_INTERACTION_TYPE, mInteractionType);
-            }
-            if (mInteractionCount != INVALID_LONG_VALUE) {
-                values.put(PreviewProgramColumns.COLUMN_INTERACTION_COUNT, mInteractionCount);
-            }
-            if (!TextUtils.isEmpty(mAuthor)) {
-                values.put(PreviewProgramColumns.COLUMN_AUTHOR, mAuthor);
-            }
-            if (!TextUtils.isEmpty(mContentId)) {
-                values.put(PreviewProgramColumns.COLUMN_CONTENT_ID, mContentId);
-            }
-            if (includeProtectedFields) {
-                if (BuildCompat.isAtLeastO()) {
-                    if (mBrowsable != INVALID_INT_VALUE) {
-                        values.put(PreviewProgramColumns.COLUMN_BROWSABLE, mBrowsable);
-                    }
-                }
-            }
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
+            values.remove(PreviewProgramColumns.COLUMN_INTERNAL_PROVIDER_ID);
+            values.remove(PreviewProgramColumns.COLUMN_PREVIEW_VIDEO_URI);
+            values.remove(PreviewProgramColumns.COLUMN_LAST_PLAYBACK_POSITION_MILLIS);
+            values.remove(PreviewProgramColumns.COLUMN_DURATION_MILLIS);
+            values.remove(PreviewProgramColumns.COLUMN_INTENT_URI);
+            values.remove(PreviewProgramColumns.COLUMN_TRANSIENT);
+            values.remove(PreviewProgramColumns.COLUMN_TYPE);
+            values.remove(PreviewProgramColumns.COLUMN_POSTER_ART_ASPECT_RATIO);
+            values.remove(PreviewProgramColumns.COLUMN_THUMBNAIL_ASPECT_RATIO);
+            values.remove(PreviewProgramColumns.COLUMN_LOGO_URI);
+            values.remove(PreviewProgramColumns.COLUMN_AVAILABILITY);
+            values.remove(PreviewProgramColumns.COLUMN_STARTING_PRICE);
+            values.remove(PreviewProgramColumns.COLUMN_OFFER_PRICE);
+            values.remove(PreviewProgramColumns.COLUMN_RELEASE_DATE);
+            values.remove(PreviewProgramColumns.COLUMN_ITEM_COUNT);
+            values.remove(PreviewProgramColumns.COLUMN_LIVE);
+            values.remove(PreviewProgramColumns.COLUMN_INTERACTION_COUNT);
+            values.remove(PreviewProgramColumns.COLUMN_AUTHOR);
+            values.remove(PreviewProgramColumns.COLUMN_CONTENT_ID);
+        }
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O || !includeProtectedFields) {
+            values.remove(PreviewProgramColumns.COLUMN_BROWSABLE);
         }
         return values;
     }
@@ -418,7 +315,7 @@
         // TODO: Add additional API which does not use costly getColumnIndex().
         BaseProgram.setFieldsFromCursor(cursor, builder);
         int index;
-        if (BuildCompat.isAtLeastO()) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             if ((index =
                     cursor.getColumnIndex(PreviewProgramColumns.COLUMN_INTERNAL_PROVIDER_ID)) >= 0
                     && !cursor.isNull(index)) {
@@ -552,28 +449,6 @@
             sFormat.setTimeZone(TimeZone.getTimeZone("GMT-0"));
         }
 
-        private String mExternalId;
-        private Uri mPreviewVideoUri;
-        private int mLastPlaybackPositionMillis = INVALID_INT_VALUE;
-        private int mDurationMillis = INVALID_INT_VALUE;
-        private Uri mIntentUri;
-        private int mTransient = INVALID_INT_VALUE;
-        private int mType = INVALID_INT_VALUE;
-        private int mPosterArtAspectRatio = INVALID_INT_VALUE;
-        private int mThumbnailAspectRatio = INVALID_INT_VALUE;
-        private Uri mLogoUri;
-        private int mAvailability = INVALID_INT_VALUE;
-        private String mStartingPrice;
-        private String mOfferPrice;
-        private String mReleaseDate;
-        private int mItemCount = INVALID_INT_VALUE;
-        private int mLive = INVALID_INT_VALUE;
-        private int mInteractionType = INVALID_INT_VALUE;
-        private long mInteractionCount = INVALID_LONG_VALUE;
-        private String mAuthor;
-        private int mBrowsable = INVALID_INT_VALUE;
-        private String mContentId;
-
         /**
          * Creates a new Builder object.
          */
@@ -585,28 +460,7 @@
          * @param other The Program you're copying from.
          */
         public Builder(BasePreviewProgram other) {
-            super(other);
-            mExternalId = other.mInternalProviderId;
-            mPreviewVideoUri = other.mPreviewVideoUri;
-            mLastPlaybackPositionMillis = other.mLastPlaybackPositionMillis;
-            mDurationMillis = other.mDurationMillis;
-            mIntentUri = other.mIntentUri;
-            mTransient = other.mTransient;
-            mType = other.mType;
-            mPosterArtAspectRatio = other.mPosterArtAspectRatio;
-            mThumbnailAspectRatio = other.mThumbnailAspectRatio;
-            mLogoUri = other.mLogoUri;
-            mAvailability = other.mAvailability;
-            mStartingPrice = other.mStartingPrice;
-            mOfferPrice = other.mOfferPrice;
-            mReleaseDate = other.mReleaseDate;
-            mItemCount = other.mItemCount;
-            mLive = other.mLive;
-            mInteractionType = other.mInteractionType;
-            mInteractionCount  = other.mInteractionCount;
-            mAuthor = other.mAuthor;
-            mBrowsable = other.mBrowsable;
-            mContentId = other.mContentId;
+            mValues = new ContentValues(other.mValues);
         }
 
         /**
@@ -617,7 +471,7 @@
          * @see PreviewPrograms#COLUMN_INTERNAL_PROVIDER_ID
          */
         public T setInternalProviderId(String externalId) {
-            mExternalId = externalId;
+            mValues.put(PreviewPrograms.COLUMN_INTERNAL_PROVIDER_ID, externalId);
             return (T) this;
         }
 
@@ -629,7 +483,8 @@
          * @see PreviewPrograms#COLUMN_PREVIEW_VIDEO_URI
          */
         public T setPreviewVideoUri(Uri previewVideoUri) {
-            mPreviewVideoUri = previewVideoUri;
+            mValues.put(PreviewPrograms.COLUMN_PREVIEW_VIDEO_URI,
+                    previewVideoUri == null ? null : previewVideoUri.toString());
             return (T) this;
         }
 
@@ -641,7 +496,7 @@
          * @see PreviewPrograms#COLUMN_LAST_PLAYBACK_POSITION_MILLIS
          */
         public T setLastPlaybackPositionMillis(int position) {
-            mLastPlaybackPositionMillis = position;
+            mValues.put(PreviewPrograms.COLUMN_LAST_PLAYBACK_POSITION_MILLIS, position);
             return (T) this;
         }
 
@@ -653,7 +508,7 @@
          * @see PreviewPrograms#COLUMN_DURATION_MILLIS
          */
         public T setDurationMillis(int duration) {
-            mDurationMillis = duration;
+            mValues.put(PreviewPrograms.COLUMN_DURATION_MILLIS, duration);
             return (T) this;
         }
 
@@ -665,7 +520,8 @@
          * @see PreviewPrograms#COLUMN_INTENT_URI
          */
         public T setIntentUri(Uri intentUri) {
-            mIntentUri = intentUri;
+            mValues.put(PreviewPrograms.COLUMN_INTENT_URI,
+                    intentUri == null ? null : intentUri.toString());
             return (T) this;
         }
 
@@ -687,7 +543,7 @@
          * @see PreviewPrograms#COLUMN_TRANSIENT
          */
         public T setTransient(boolean transientValue) {
-            mTransient = transientValue ? IS_TRANSIENT : 0;
+            mValues.put(PreviewPrograms.COLUMN_TRANSIENT, transientValue ? IS_TRANSIENT : 0);
             return (T) this;
         }
 
@@ -713,7 +569,7 @@
          * @see PreviewPrograms#COLUMN_TYPE
          */
         public T setType(@Type int type) {
-            mType = type;
+            mValues.put(PreviewPrograms.COLUMN_TYPE, type);
             return (T) this;
         }
 
@@ -733,7 +589,7 @@
          * @see PreviewPrograms#COLUMN_POSTER_ART_URI
          */
         public T setPosterArtAspectRatio(@AspectRatio int ratio) {
-            mPosterArtAspectRatio = ratio;
+            mValues.put(PreviewPrograms.COLUMN_POSTER_ART_ASPECT_RATIO, ratio);
             return (T) this;
         }
 
@@ -752,7 +608,7 @@
          * @see PreviewPrograms#COLUMN_THUMBNAIL_ASPECT_RATIO
          */
         public T setThumbnailAspectRatio(@AspectRatio int ratio) {
-            mThumbnailAspectRatio = ratio;
+            mValues.put(PreviewPrograms.COLUMN_THUMBNAIL_ASPECT_RATIO, ratio);
             return (T) this;
         }
 
@@ -764,7 +620,8 @@
          * @see PreviewPrograms#COLUMN_LOGO_URI
          */
         public T setLogoUri(Uri logoUri) {
-            mLogoUri = logoUri;
+            mValues.put(PreviewPrograms.COLUMN_LOGO_URI,
+                    logoUri == null ? null : logoUri.toString());
             return (T) this;
         }
 
@@ -781,7 +638,7 @@
          * @see PreviewPrograms#COLUMN_AVAILABILITY
          */
         public T setAvailability(@Availability int availability) {
-            mAvailability = availability;
+            mValues.put(PreviewPrograms.COLUMN_AVAILABILITY, availability);
             return (T) this;
         }
 
@@ -793,7 +650,7 @@
          * @see PreviewPrograms#COLUMN_STARTING_PRICE
          */
         public T setStartingPrice(String price) {
-            mStartingPrice = price;
+            mValues.put(PreviewPrograms.COLUMN_STARTING_PRICE, price);
             return (T) this;
         }
 
@@ -805,7 +662,7 @@
          * @see PreviewPrograms#COLUMN_OFFER_PRICE
          */
         public T setOfferPrice(String price) {
-            mOfferPrice = price;
+            mValues.put(PreviewPrograms.COLUMN_OFFER_PRICE, price);
             return (T) this;
         }
 
@@ -820,7 +677,7 @@
          * @see PreviewPrograms#COLUMN_RELEASE_DATE
          */
         public T setReleaseDate(String releaseDate) {
-            mReleaseDate = releaseDate;
+            mValues.put(PreviewPrograms.COLUMN_RELEASE_DATE, releaseDate);
             return (T) this;
         }
 
@@ -832,7 +689,7 @@
          * @see PreviewPrograms#COLUMN_RELEASE_DATE
          */
         public T setReleaseDate(Date releaseDate) {
-            mReleaseDate = sFormat.format(releaseDate);
+            mValues.put(PreviewPrograms.COLUMN_RELEASE_DATE, sFormat.format(releaseDate));
             return (T) this;
         }
 
@@ -844,7 +701,7 @@
          * @see PreviewPrograms#COLUMN_ITEM_COUNT
          */
         public T setItemCount(int itemCount) {
-            mItemCount = itemCount;
+            mValues.put(PreviewPrograms.COLUMN_ITEM_COUNT, itemCount);
             return (T) this;
         }
 
@@ -856,7 +713,7 @@
          * @see PreviewPrograms#COLUMN_LIVE
          */
         public T setLive(boolean live) {
-            mLive = live ? IS_LIVE : 0;
+            mValues.put(PreviewPrograms.COLUMN_LIVE, live ? IS_LIVE : 0);
             return (T) this;
         }
 
@@ -877,7 +734,7 @@
          * @see PreviewPrograms#COLUMN_INTERACTION_TYPE
          */
         public T setInteractionType(@InteractionType int interactionType) {
-            mInteractionType = interactionType;
+            mValues.put(PreviewPrograms.COLUMN_INTERACTION_TYPE, interactionType);
             return (T) this;
         }
 
@@ -889,7 +746,7 @@
          * @see PreviewPrograms#COLUMN_INTERACTION_COUNT
          */
         public T setInteractionCount(long interactionCount) {
-            mInteractionCount = interactionCount;
+            mValues.put(PreviewPrograms.COLUMN_INTERACTION_COUNT, interactionCount);
             return (T) this;
         }
 
@@ -901,7 +758,7 @@
          * @see PreviewPrograms#COLUMN_AUTHOR
          */
         public T setAuthor(String author) {
-            mAuthor = author;
+            mValues.put(PreviewPrograms.COLUMN_AUTHOR, author);
             return (T) this;
         }
 
@@ -915,7 +772,7 @@
          */
         @RestrictTo(LIBRARY_GROUP)
         public T setBrowsable(boolean browsable) {
-            mBrowsable = browsable ? IS_BROWSABLE : 0;
+            mValues.put(PreviewPrograms.COLUMN_BROWSABLE, browsable ? IS_BROWSABLE : 0);
             return (T) this;
         }
 
@@ -927,7 +784,7 @@
          * @see PreviewPrograms#COLUMN_CONTENT_ID
          */
         public T setContentId(String contentId) {
-            mContentId = contentId;
+            mValues.put(PreviewPrograms.COLUMN_CONTENT_ID, contentId);
             return (T) this;
         }
     }
diff --git a/tv-provider/src/android/support/media/tv/BaseProgram.java b/tv-provider/src/android/support/media/tv/BaseProgram.java
index 4b9223e..885b544 100644
--- a/tv-provider/src/android/support/media/tv/BaseProgram.java
+++ b/tv-provider/src/android/support/media/tv/BaseProgram.java
@@ -28,11 +28,6 @@
 import android.support.media.tv.TvContractCompat.ProgramColumns.ReviewRatingStyle;
 import android.support.media.tv.TvContractCompat.Programs;
 import android.support.media.tv.TvContractCompat.Programs.Genres.Genre;
-import android.support.v4.os.BuildCompat;
-import android.text.TextUtils;
-
-import java.util.Arrays;
-import java.util.Objects;
 
 /**
  * Base class for derived classes that want to have common fields for programs defined in
@@ -49,57 +44,13 @@
     private static final int INVALID_INT_VALUE = -1;
     private static final int IS_SEARCHABLE = 1;
 
-    private final long mId;
-    private final String mPackageName;
-    private final String mTitle;
-    private final String mEpisodeTitle;
-    private final String mSeasonNumber;
-    private final String mEpisodeNumber;
-    private final String mDescription;
-    private final String mLongDescription;
-    private final int mVideoWidth;
-    private final int mVideoHeight;
-    private final Uri mPosterArtUri;
-    private final Uri mThumbnailUri;
-    private final String[] mCanonicalGenres;
-    private final TvContentRating[] mContentRatings;
-    private final byte[] mInternalProviderData;
-    private final String[] mAudioLanguages;
-    private final int mSearchable;
-    private final Long mInternalProviderFlag1;
-    private final Long mInternalProviderFlag2;
-    private final Long mInternalProviderFlag3;
-    private final Long mInternalProviderFlag4;
-    private final int mReviewRatingStyle;
-    private final String mReviewRating;
-    private final String mSeasonTitle;
+    /** @hide */
+    @RestrictTo(LIBRARY_GROUP)
+    protected ContentValues mValues;
 
     /* package-private */
     BaseProgram(Builder builder) {
-        mId = builder.mId;
-        mPackageName = builder.mPackageName;
-        mTitle = builder.mTitle;
-        mEpisodeTitle = builder.mEpisodeTitle;
-        mSeasonNumber = builder.mSeasonNumber;
-        mEpisodeNumber = builder.mEpisodeNumber;
-        mDescription = builder.mDescription;
-        mLongDescription = builder.mLongDescription;
-        mVideoWidth = builder.mVideoWidth;
-        mVideoHeight = builder.mVideoHeight;
-        mPosterArtUri = builder.mPosterArtUri;
-        mThumbnailUri = builder.mThumbnailUri;
-        mCanonicalGenres = builder.mCanonicalGenres;
-        mContentRatings = builder.mContentRatings;
-        mInternalProviderData = builder.mInternalProviderData;
-        mAudioLanguages = builder.mAudioLanguages;
-        mSearchable = builder.mSearchable;
-        mInternalProviderFlag1 = builder.mInternalProviderFlag1;
-        mInternalProviderFlag2 = builder.mInternalProviderFlag2;
-        mInternalProviderFlag3 = builder.mInternalProviderFlag3;
-        mInternalProviderFlag4 = builder.mInternalProviderFlag4;
-        mReviewRatingStyle = builder.mReviewRatingStyle;
-        mReviewRating = builder.mReviewRating;
-        mSeasonTitle = builder.mSeasonTitle;
+        mValues = builder.mValues;
     }
 
     /**
@@ -107,7 +58,8 @@
      * @see BaseTvColumns#_ID
      */
     public long getId() {
-        return mId;
+        Long l = mValues.getAsLong(BaseTvColumns._ID);
+        return l == null ? INVALID_LONG_VALUE : l;
     }
 
     /**
@@ -117,7 +69,7 @@
      */
     @RestrictTo(LIBRARY_GROUP)
     public String getPackageName() {
-        return mPackageName;
+        return mValues.getAsString(BaseTvColumns.COLUMN_PACKAGE_NAME);
     }
 
     /**
@@ -125,7 +77,7 @@
      * @see Programs#COLUMN_TITLE
      */
     public String getTitle() {
-        return mTitle;
+        return mValues.getAsString(Programs.COLUMN_TITLE);
     }
 
     /**
@@ -133,7 +85,7 @@
      * @see Programs#COLUMN_EPISODE_TITLE
      */
     public String getEpisodeTitle() {
-        return mEpisodeTitle;
+        return mValues.getAsString(Programs.COLUMN_EPISODE_TITLE);
     }
 
     /**
@@ -141,7 +93,11 @@
      * @see Programs#COLUMN_SEASON_DISPLAY_NUMBER
      */
     public String getSeasonNumber() {
-        return mSeasonNumber;
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            return mValues.getAsString(Programs.COLUMN_SEASON_DISPLAY_NUMBER);
+        } else {
+            return mValues.getAsString(Programs.COLUMN_SEASON_NUMBER);
+        }
     }
 
     /**
@@ -149,7 +105,11 @@
      * @see Programs#COLUMN_EPISODE_DISPLAY_NUMBER
      */
     public String getEpisodeNumber() {
-        return mEpisodeNumber;
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            return mValues.getAsString(Programs.COLUMN_EPISODE_DISPLAY_NUMBER);
+        } else {
+            return mValues.getAsString(Programs.COLUMN_EPISODE_NUMBER);
+        }
     }
 
     /**
@@ -157,7 +117,7 @@
      * @see Programs#COLUMN_SHORT_DESCRIPTION
      */
     public String getDescription() {
-        return mDescription;
+        return mValues.getAsString(Programs.COLUMN_SHORT_DESCRIPTION);
     }
 
     /**
@@ -165,7 +125,7 @@
      * @see Programs#COLUMN_LONG_DESCRIPTION
      */
     public String getLongDescription() {
-        return mLongDescription;
+        return mValues.getAsString(Programs.COLUMN_LONG_DESCRIPTION);
     }
 
     /**
@@ -173,7 +133,8 @@
      * @see Programs#COLUMN_VIDEO_WIDTH
      */
     public int getVideoWidth() {
-        return mVideoWidth;
+        Integer i = mValues.getAsInteger(Programs.COLUMN_VIDEO_WIDTH);
+        return i == null ? INVALID_INT_VALUE : i;
     }
 
     /**
@@ -181,7 +142,8 @@
      * @see Programs#COLUMN_VIDEO_HEIGHT
      */
     public int getVideoHeight() {
-        return mVideoHeight;
+        Integer i = mValues.getAsInteger(Programs.COLUMN_VIDEO_HEIGHT);
+        return i == null ? INVALID_INT_VALUE : i;
     }
 
     /**
@@ -189,7 +151,7 @@
      * @see Programs#COLUMN_CANONICAL_GENRE
      */
     public @Genre String[] getCanonicalGenres() {
-        return mCanonicalGenres;
+        return Programs.Genres.decode(mValues.getAsString(Programs.COLUMN_CANONICAL_GENRE));
     }
 
     /**
@@ -197,7 +159,8 @@
      * @see Programs#COLUMN_CONTENT_RATING
      */
     public TvContentRating[] getContentRatings() {
-        return mContentRatings;
+        return TvContractUtils.stringToContentRatings(mValues.getAsString(
+                Programs.COLUMN_CONTENT_RATING));
     }
 
     /**
@@ -205,7 +168,8 @@
      * @see Programs#COLUMN_POSTER_ART_URI
      */
     public Uri getPosterArtUri() {
-        return mPosterArtUri;
+        String uri = mValues.getAsString(Programs.COLUMN_POSTER_ART_URI);
+        return uri == null ? null : Uri.parse(uri);
     }
 
     /**
@@ -213,7 +177,8 @@
      * @see Programs#COLUMN_THUMBNAIL_URI
      */
     public Uri getThumbnailUri() {
-        return mThumbnailUri;
+        String uri = mValues.getAsString(Programs.COLUMN_POSTER_ART_URI);
+        return uri == null ? null : Uri.parse(uri);
     }
 
     /**
@@ -221,7 +186,7 @@
      * @see Programs#COLUMN_INTERNAL_PROVIDER_DATA
      */
     public byte[] getInternalProviderDataByteArray() {
-        return mInternalProviderData;
+        return mValues.getAsByteArray(Programs.COLUMN_INTERNAL_PROVIDER_DATA);
     }
 
     /**
@@ -229,7 +194,8 @@
      * @see Programs#COLUMN_AUDIO_LANGUAGE
      */
     public String[] getAudioLanguages() {
-        return mAudioLanguages;
+        return TvContractUtils.stringToAudioLanguages(mValues.getAsString(
+                Programs.COLUMN_AUDIO_LANGUAGE));
     }
 
     /**
@@ -237,7 +203,8 @@
      * @see Programs#COLUMN_SEARCHABLE
      */
     public boolean isSearchable() {
-        return mSearchable == IS_SEARCHABLE || mSearchable == INVALID_INT_VALUE;
+        Integer i = mValues.getAsInteger(Programs.COLUMN_SEARCHABLE);
+        return i == null || i == IS_SEARCHABLE;
     }
 
     /**
@@ -245,7 +212,7 @@
      * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG1
      */
     public Long getInternalProviderFlag1() {
-        return mInternalProviderFlag1;
+        return mValues.getAsLong(Programs.COLUMN_INTERNAL_PROVIDER_FLAG1);
     }
 
     /**
@@ -253,7 +220,7 @@
      * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG2
      */
     public Long getInternalProviderFlag2() {
-        return mInternalProviderFlag2;
+        return mValues.getAsLong(Programs.COLUMN_INTERNAL_PROVIDER_FLAG2);
     }
 
     /**
@@ -261,7 +228,7 @@
      * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG3
      */
     public Long getInternalProviderFlag3() {
-        return mInternalProviderFlag3;
+        return mValues.getAsLong(Programs.COLUMN_INTERNAL_PROVIDER_FLAG3);
     }
 
     /**
@@ -269,7 +236,7 @@
      * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG4
      */
     public Long getInternalProviderFlag4() {
-        return mInternalProviderFlag4;
+        return mValues.getAsLong(Programs.COLUMN_INTERNAL_PROVIDER_FLAG4);
     }
 
     /**
@@ -277,7 +244,7 @@
      * @see Programs#COLUMN_SEASON_TITLE
      */
     public String getSeasonTitle() {
-        return mSeasonTitle;
+        return mValues.getAsString(Programs.COLUMN_SEASON_TITLE);
     }
 
     /**
@@ -285,7 +252,8 @@
      * @see Programs#COLUMN_REVIEW_RATING_STYLE
      */
     public @ReviewRatingStyle int getReviewRatingStyle() {
-        return mReviewRatingStyle;
+        Integer i = mValues.getAsInteger(Programs.COLUMN_REVIEW_RATING_STYLE);
+        return i == null ? INVALID_INT_VALUE : i;
     }
 
     /**
@@ -293,15 +261,12 @@
      * @see Programs#COLUMN_REVIEW_RATING
      */
     public String getReviewRating() {
-        return mReviewRating;
+        return mValues.getAsString(Programs.COLUMN_REVIEW_RATING);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(
-                mTitle, mEpisodeTitle, mDescription, mLongDescription, mVideoWidth, mVideoHeight,
-                mPosterArtUri, mThumbnailUri, Arrays.hashCode(mContentRatings),
-                Arrays.hashCode(mCanonicalGenres), mSeasonNumber, mEpisodeNumber);
+        return mValues.hashCode();
     }
 
     @Override
@@ -309,51 +274,12 @@
         if (!(other instanceof BaseProgram)) {
             return false;
         }
-        BaseProgram program = (BaseProgram) other;
-        return Objects.equals(mTitle, program.mTitle)
-                && Objects.equals(mEpisodeTitle, program.mEpisodeTitle)
-                && Objects.equals(mSeasonNumber, program.mSeasonNumber)
-                && Objects.equals(mEpisodeNumber, program.mEpisodeNumber)
-                && Objects.equals(mDescription, program.mDescription)
-                && Objects.equals(mLongDescription, program.mLongDescription)
-                && mVideoWidth == program.mVideoWidth
-                && mVideoHeight == program.mVideoHeight
-                && Objects.equals(mPosterArtUri, program.mPosterArtUri)
-                && Objects.equals(mThumbnailUri, program.mThumbnailUri)
-                && Arrays.equals(mInternalProviderData, program.mInternalProviderData)
-                && Arrays.equals(mCanonicalGenres, program.mCanonicalGenres)
-                && Arrays.equals(mContentRatings, program.mContentRatings)
-                && Arrays.equals(mAudioLanguages, program.mAudioLanguages)
-                && (Build.VERSION.SDK_INT < Build.VERSION_CODES.M
-                        || (Objects.equals(mSearchable, program.mSearchable)
-                        && Objects.equals(mInternalProviderFlag1, program.mInternalProviderFlag1)
-                        && Objects.equals(mInternalProviderFlag2, program.mInternalProviderFlag2)
-                        && Objects.equals(mInternalProviderFlag3, program.mInternalProviderFlag3)
-                        && Objects.equals(mInternalProviderFlag4, program.mInternalProviderFlag4)))
-                && (Build.VERSION.SDK_INT < Build.VERSION_CODES.N
-                        || Objects.equals(mSeasonTitle, program.mSeasonTitle))
-                && (!BuildCompat.isAtLeastO()
-                        || (Objects.equals(mReviewRatingStyle, program.mReviewRatingStyle)
-                        && Objects.equals(mReviewRating, program.mReviewRating)));
+        return mValues.equals(((BaseProgram) other).mValues);
     }
 
     @Override
     public String toString() {
-        return "BaseProgram{"
-                + "id=" + mId
-                + ", packageName=" + mPackageName
-                + ", title=" + mTitle
-                + ", episodeTitle=" + mEpisodeTitle
-                + ", seasonNumber=" + mSeasonNumber
-                + ", episodeNumber=" + mEpisodeNumber
-                + ", videoWidth=" + mVideoWidth
-                + ", videoHeight=" + mVideoHeight
-                + ", contentRatings=" + Arrays.toString(mContentRatings)
-                + ", posterArtUri=" + mPosterArtUri
-                + ", thumbnailUri=" + mThumbnailUri
-                + ", contentRatings=" + Arrays.toString(mContentRatings)
-                + ", genres=" + Arrays.toString(mCanonicalGenres)
-                + "}";
+        return "BaseProgram{" + mValues.toString() + "}";
     }
 
     /**
@@ -361,129 +287,20 @@
      * into the TV Input Framework database.
      */
     public ContentValues toContentValues() {
-        ContentValues values = new ContentValues();
-        if (mId != INVALID_LONG_VALUE) {
-            values.put(BaseTvColumns._ID, mId);
+        ContentValues values = new ContentValues(mValues);
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
+            values.remove(ProgramColumns.COLUMN_SEARCHABLE);
+            values.remove(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG1);
+            values.remove(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG2);
+            values.remove(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG3);
+            values.remove(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG4);
         }
-        if (!TextUtils.isEmpty(mPackageName)) {
-            values.put(BaseTvColumns.COLUMN_PACKAGE_NAME, mPackageName);
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
+            values.remove(ProgramColumns.COLUMN_SEASON_TITLE);
         }
-        if (!TextUtils.isEmpty(mTitle)) {
-            values.put(ProgramColumns.COLUMN_TITLE, mTitle);
-        } else {
-            values.putNull(ProgramColumns.COLUMN_TITLE);
-        }
-        if (!TextUtils.isEmpty(mEpisodeTitle)) {
-            values.put(ProgramColumns.COLUMN_EPISODE_TITLE, mEpisodeTitle);
-        } else {
-            values.putNull(ProgramColumns.COLUMN_EPISODE_TITLE);
-        }
-        if (!TextUtils.isEmpty(mSeasonNumber) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-            values.put(ProgramColumns.COLUMN_SEASON_DISPLAY_NUMBER, mSeasonNumber);
-        } else if (!TextUtils.isEmpty(mSeasonNumber)
-                && Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
-            values.put(Programs.COLUMN_SEASON_NUMBER,
-                    Integer.parseInt(mSeasonNumber));
-        } else {
-            values.putNull(TvContractCompat.Programs.COLUMN_SEASON_NUMBER);
-        }
-        if (!TextUtils.isEmpty(mEpisodeNumber) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-            values.put(ProgramColumns.COLUMN_EPISODE_DISPLAY_NUMBER, mEpisodeNumber);
-        } else if (!TextUtils.isEmpty(mEpisodeNumber)
-                && Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
-            values.put(Programs.COLUMN_EPISODE_NUMBER,
-                    Integer.parseInt(mEpisodeNumber));
-        } else {
-            values.putNull(Programs.COLUMN_EPISODE_NUMBER);
-        }
-        if (!TextUtils.isEmpty(mDescription)) {
-            values.put(ProgramColumns.COLUMN_SHORT_DESCRIPTION, mDescription);
-        } else {
-            values.putNull(ProgramColumns.COLUMN_SHORT_DESCRIPTION);
-        }
-        if (!TextUtils.isEmpty(mLongDescription)) {
-            values.put(ProgramColumns.COLUMN_LONG_DESCRIPTION, mLongDescription);
-        } else {
-            values.putNull(ProgramColumns.COLUMN_LONG_DESCRIPTION);
-        }
-        if (mPosterArtUri != null) {
-            values.put(ProgramColumns.COLUMN_POSTER_ART_URI, mPosterArtUri.toString());
-        } else {
-            values.putNull(ProgramColumns.COLUMN_POSTER_ART_URI);
-        }
-        if (mThumbnailUri != null) {
-            values.put(ProgramColumns.COLUMN_THUMBNAIL_URI, mThumbnailUri.toString());
-        } else {
-            values.putNull(ProgramColumns.COLUMN_THUMBNAIL_URI);
-        }
-        if (mAudioLanguages != null && mAudioLanguages.length > 0) {
-            values.put(ProgramColumns.COLUMN_AUDIO_LANGUAGE,
-                    TvContractUtils.audioLanguagesToString(mAudioLanguages));
-        } else {
-            values.putNull(ProgramColumns.COLUMN_AUDIO_LANGUAGE);
-        }
-        if (mCanonicalGenres != null && mCanonicalGenres.length > 0) {
-            values.put(ProgramColumns.COLUMN_CANONICAL_GENRE,
-                    Programs.Genres.encode(mCanonicalGenres));
-        } else {
-            values.putNull(ProgramColumns.COLUMN_CANONICAL_GENRE);
-        }
-        if (mContentRatings != null && mContentRatings.length > 0) {
-            values.put(ProgramColumns.COLUMN_CONTENT_RATING,
-                    TvContractUtils.contentRatingsToString(mContentRatings));
-        } else {
-            values.putNull(ProgramColumns.COLUMN_CONTENT_RATING);
-        }
-        if (mVideoWidth != INVALID_INT_VALUE) {
-            values.put(ProgramColumns.COLUMN_VIDEO_WIDTH, mVideoWidth);
-        } else {
-            values.putNull(ProgramColumns.COLUMN_VIDEO_WIDTH);
-        }
-        if (mVideoHeight != INVALID_INT_VALUE) {
-            values.put(ProgramColumns.COLUMN_VIDEO_HEIGHT, mVideoHeight);
-        } else {
-            values.putNull(ProgramColumns.COLUMN_VIDEO_HEIGHT);
-        }
-        if (mInternalProviderData != null && mInternalProviderData.length > 0) {
-            values.put(ProgramColumns.COLUMN_INTERNAL_PROVIDER_DATA,
-                    mInternalProviderData);
-        } else {
-            values.putNull(ProgramColumns.COLUMN_INTERNAL_PROVIDER_DATA);
-        }
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-            if (mSearchable != INVALID_INT_VALUE) {
-                values.put(ProgramColumns.COLUMN_SEARCHABLE, mSearchable);
-            }
-            if (mInternalProviderFlag1 != null) {
-                values.put(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG1,
-                        mInternalProviderFlag1);
-            }
-            if (mInternalProviderFlag2 != null) {
-                values.put(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG2,
-                        mInternalProviderFlag2);
-            }
-            if (mInternalProviderFlag3 != null) {
-                values.put(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG3,
-                        mInternalProviderFlag3);
-            }
-            if (mInternalProviderFlag4 != null) {
-                values.put(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG4,
-                        mInternalProviderFlag4);
-            }
-        }
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-            if (!TextUtils.isEmpty(mSeasonTitle)) {
-                values.put(ProgramColumns.COLUMN_SEASON_TITLE, mSeasonTitle);
-            }
-        }
-        if (BuildCompat.isAtLeastO()) {
-            if (mReviewRatingStyle != INVALID_INT_VALUE) {
-                values.put(ProgramColumns.COLUMN_REVIEW_RATING_STYLE,
-                        mReviewRatingStyle);
-            }
-            if (!TextUtils.isEmpty(mReviewRating)) {
-                values.put(ProgramColumns.COLUMN_REVIEW_RATING, mReviewRating);
-            }
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
+            values.remove(ProgramColumns.COLUMN_REVIEW_RATING_STYLE);
+            values.remove(ProgramColumns.COLUMN_REVIEW_RATING);
         }
         return values;
     }
@@ -611,7 +428,7 @@
                 builder.setSeasonTitle(cursor.getString(index));
             }
         }
-        if (BuildCompat.isAtLeastO()) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             if ((index = cursor.getColumnIndex(
                     ProgramColumns.COLUMN_REVIEW_RATING_STYLE)) >= 0
                     && !cursor.isNull(index)) {
@@ -661,7 +478,7 @@
                 ProgramColumns.COLUMN_REVIEW_RATING,
                 ProgramColumns.COLUMN_REVIEW_RATING_STYLE,
         };
-        if (BuildCompat.isAtLeastO()) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             return CollectionUtils.concatAll(baseColumns, marshmallowColumns, nougatColumns,
                 oColumns);
         } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
@@ -679,35 +496,15 @@
      * @param <T> The Builder of the derived classe.
      */
     public abstract static class Builder<T extends Builder> {
-        private long mId = INVALID_LONG_VALUE;
-        private String mPackageName;
-        private String mTitle;
-        private String mEpisodeTitle;
-        private String mSeasonNumber;
-        private String mEpisodeNumber;
-        private String mDescription;
-        private String mLongDescription;
-        private int mVideoWidth = INVALID_INT_VALUE;
-        private int mVideoHeight = INVALID_INT_VALUE;
-        private Uri mPosterArtUri;
-        private Uri mThumbnailUri;
-        private String[] mCanonicalGenres;
-        private TvContentRating[] mContentRatings;
-        private byte[] mInternalProviderData;
-        private String[] mAudioLanguages;
-        private int mSearchable = INVALID_INT_VALUE;
-        private Long mInternalProviderFlag1;
-        private Long mInternalProviderFlag2;
-        private Long mInternalProviderFlag3;
-        private Long mInternalProviderFlag4;
-        private int mReviewRatingStyle = INVALID_INT_VALUE;
-        private String mReviewRating;
-        private String mSeasonTitle;
+        /** @hide */
+        @RestrictTo(LIBRARY_GROUP)
+        protected ContentValues mValues;
 
         /**
          * Creates a new Builder object.
          */
         public Builder() {
+            mValues = new ContentValues();
         }
 
         /**
@@ -715,30 +512,7 @@
          * @param other The Program you're copying from.
          */
         public Builder(BaseProgram other) {
-            mId = other.mId;
-            mPackageName = other.mPackageName;
-            mTitle = other.mTitle;
-            mEpisodeTitle = other.mEpisodeTitle;
-            mSeasonNumber = other.mSeasonNumber;
-            mEpisodeNumber = other.mEpisodeNumber;
-            mDescription = other.mDescription;
-            mLongDescription = other.mLongDescription;
-            mVideoWidth = other.mVideoWidth;
-            mVideoHeight = other.mVideoHeight;
-            mPosterArtUri = other.mPosterArtUri;
-            mThumbnailUri = other.mThumbnailUri;
-            mCanonicalGenres = other.mCanonicalGenres;
-            mContentRatings = other.mContentRatings;
-            mInternalProviderData = other.mInternalProviderData;
-            mAudioLanguages = other.mAudioLanguages;
-            mSearchable = other.mSearchable;
-            mInternalProviderFlag1 = other.mInternalProviderFlag1;
-            mInternalProviderFlag2 = other.mInternalProviderFlag2;
-            mInternalProviderFlag3 = other.mInternalProviderFlag3;
-            mInternalProviderFlag4 = other.mInternalProviderFlag4;
-            mReviewRatingStyle = other.mReviewRatingStyle;
-            mReviewRating = other.mReviewRating;
-            mSeasonTitle = other.mSeasonTitle;
+            mValues = new ContentValues(other.mValues);
         }
 
         /**
@@ -749,7 +523,7 @@
          * @see BaseTvColumns#_ID
          */
         public T setId(long programId) {
-            mId = programId;
+            mValues.put(BaseTvColumns._ID, programId);
             return (T) this;
         }
 
@@ -763,7 +537,7 @@
          */
         @RestrictTo(LIBRARY_GROUP)
         public T setPackageName(String packageName) {
-            mPackageName = packageName;
+            mValues.put(BaseTvColumns.COLUMN_PACKAGE_NAME, packageName);
             return (T) this;
         }
 
@@ -775,7 +549,7 @@
          * @see Programs#COLUMN_TITLE
          */
         public T setTitle(String title) {
-            mTitle = title;
+            mValues.put(Programs.COLUMN_TITLE, title);
             return (T) this;
         }
 
@@ -787,7 +561,7 @@
          * @see Programs#COLUMN_EPISODE_TITLE
          */
         public T setEpisodeTitle(String episodeTitle) {
-            mEpisodeTitle = episodeTitle;
+            mValues.put(Programs.COLUMN_EPISODE_TITLE, episodeTitle);
             return (T) this;
         }
 
@@ -799,7 +573,7 @@
          * @see Programs#COLUMN_SEASON_DISPLAY_NUMBER
          */
         public T setSeasonNumber(int seasonNumber) {
-            mSeasonNumber = String.valueOf(seasonNumber);
+            setSeasonNumber(String.valueOf(seasonNumber), seasonNumber);
             return (T) this;
         }
 
@@ -815,9 +589,9 @@
          */
         public T setSeasonNumber(String seasonNumber, int numericalSeasonNumber) {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-                mSeasonNumber = seasonNumber;
+                mValues.put(Programs.COLUMN_SEASON_DISPLAY_NUMBER, seasonNumber);
             } else {
-                mSeasonNumber = String.valueOf(numericalSeasonNumber);
+                mValues.put(Programs.COLUMN_SEASON_NUMBER, numericalSeasonNumber);
             }
             return (T) this;
         }
@@ -830,7 +604,7 @@
          * @see Programs#COLUMN_EPISODE_DISPLAY_NUMBER
          */
         public T setEpisodeNumber(int episodeNumber) {
-            mEpisodeNumber = String.valueOf(episodeNumber);
+            setEpisodeNumber(String.valueOf(episodeNumber), episodeNumber);
             return (T) this;
         }
 
@@ -846,9 +620,9 @@
          */
         public T setEpisodeNumber(String episodeNumber, int numericalEpisodeNumber) {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-                mEpisodeNumber = episodeNumber;
+                mValues.put(Programs.COLUMN_EPISODE_DISPLAY_NUMBER, episodeNumber);
             } else {
-                mEpisodeNumber = String.valueOf(numericalEpisodeNumber);
+                mValues.put(Programs.COLUMN_EPISODE_NUMBER, numericalEpisodeNumber);
             }
             return (T) this;
         }
@@ -862,7 +636,7 @@
          * @see Programs#COLUMN_SHORT_DESCRIPTION
          */
         public T setDescription(String description) {
-            mDescription = description;
+            mValues.put(Programs.COLUMN_SHORT_DESCRIPTION, description);
             return (T) this;
         }
 
@@ -874,7 +648,7 @@
          * @see Programs#COLUMN_LONG_DESCRIPTION
          */
         public T setLongDescription(String longDescription) {
-            mLongDescription = longDescription;
+            mValues.put(Programs.COLUMN_LONG_DESCRIPTION, longDescription);
             return (T) this;
         }
 
@@ -886,7 +660,7 @@
          * @see Programs#COLUMN_VIDEO_WIDTH
          */
         public T setVideoWidth(int width) {
-            mVideoWidth = width;
+            mValues.put(Programs.COLUMN_VIDEO_WIDTH, width);
             return (T) this;
         }
 
@@ -898,7 +672,7 @@
          * @see Programs#COLUMN_VIDEO_HEIGHT
          */
         public T setVideoHeight(int height) {
-            mVideoHeight = height;
+            mValues.put(Programs.COLUMN_VIDEO_HEIGHT, height);
             return (T) this;
         }
 
@@ -911,7 +685,8 @@
          * @see Programs#COLUMN_CONTENT_RATING
          */
         public T setContentRatings(TvContentRating[] contentRatings) {
-            mContentRatings = contentRatings;
+            mValues.put(Programs.COLUMN_CONTENT_RATING,
+                    TvContractUtils.contentRatingsToString(contentRatings));
             return (T) this;
         }
 
@@ -923,7 +698,8 @@
          * @see Programs#COLUMN_POSTER_ART_URI
          */
         public T setPosterArtUri(Uri posterArtUri) {
-            mPosterArtUri = posterArtUri;
+            mValues.put(Programs.COLUMN_POSTER_ART_URI,
+                    posterArtUri == null ? null : posterArtUri.toString());
             return (T) this;
         }
 
@@ -935,7 +711,8 @@
          * @see Programs#COLUMN_THUMBNAIL_URI
          */
         public T setThumbnailUri(Uri thumbnailUri) {
-            mThumbnailUri = thumbnailUri;
+            mValues.put(Programs.COLUMN_THUMBNAIL_URI,
+                    thumbnailUri == null ? null : thumbnailUri.toString());
             return (T) this;
         }
 
@@ -948,7 +725,7 @@
          * @see Programs#COLUMN_CANONICAL_GENRE
          */
         public T setCanonicalGenres(@Genre String[] genres) {
-            mCanonicalGenres = genres;
+            mValues.put(Programs.COLUMN_CANONICAL_GENRE, Programs.Genres.encode(genres));
             return (T) this;
         }
 
@@ -960,7 +737,7 @@
          * @see Programs#COLUMN_INTERNAL_PROVIDER_DATA
          */
         public T setInternalProviderData(byte[] data) {
-            mInternalProviderData = data;
+            mValues.put(ProgramColumns.COLUMN_INTERNAL_PROVIDER_DATA, data);
             return (T) this;
         }
 
@@ -972,7 +749,8 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public T setAudioLanguages(String[] audioLanguages) {
-            mAudioLanguages = audioLanguages;
+            mValues.put(ProgramColumns.COLUMN_AUDIO_LANGUAGE,
+                    TvContractUtils.audioLanguagesToString(audioLanguages));
             return (T) this;
         }
 
@@ -984,7 +762,7 @@
          * @see Programs#COLUMN_SEARCHABLE
          */
         public T setSearchable(boolean searchable) {
-            mSearchable = searchable ? IS_SEARCHABLE : 0;
+            mValues.put(Programs.COLUMN_SEARCHABLE, searchable ? IS_SEARCHABLE : 0);
             return (T) this;
         }
 
@@ -996,7 +774,7 @@
          * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG1
          */
         public T setInternalProviderFlag1(long flag) {
-            mInternalProviderFlag1 = flag;
+            mValues.put(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG1, flag);
             return (T) this;
         }
 
@@ -1008,7 +786,7 @@
          * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG2
          */
         public T setInternalProviderFlag2(long flag) {
-            mInternalProviderFlag2 = flag;
+            mValues.put(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG2, flag);
             return (T) this;
         }
 
@@ -1020,7 +798,7 @@
          * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG3
          */
         public T setInternalProviderFlag3(long flag) {
-            mInternalProviderFlag3 = flag;
+            mValues.put(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG3, flag);
             return (T) this;
         }
 
@@ -1032,7 +810,7 @@
          * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG4
          */
         public T setInternalProviderFlag4(long flag) {
-            mInternalProviderFlag4 = flag;
+            mValues.put(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG4, flag);
             return (T) this;
         }
 
@@ -1048,7 +826,7 @@
          * @see Programs#REVIEW_RATING_STYLE_PERCENTAGE
          */
         public T setReviewRatingStyle(@ReviewRatingStyle int reviewRatingStyle) {
-            mReviewRatingStyle = reviewRatingStyle;
+            mValues.put(ProgramColumns.COLUMN_REVIEW_RATING_STYLE, reviewRatingStyle);
             return (T) this;
         }
 
@@ -1072,7 +850,7 @@
          * @see Programs#REVIEW_RATING_STYLE_PERCENTAGE
          */
         public T setReviewRating(String reviewRating) {
-            mReviewRating = reviewRating;
+            mValues.put(ProgramColumns.COLUMN_REVIEW_RATING, reviewRating);
             return (T) this;
         }
 
@@ -1084,7 +862,7 @@
          * @see Programs#COLUMN_SEASON_TITLE
          */
         public T setSeasonTitle(String seasonTitle) {
-            mSeasonTitle = seasonTitle;
+            mValues.put(ProgramColumns.COLUMN_SEASON_TITLE, seasonTitle);
             return (T) this;
         }
     }
diff --git a/tv-provider/src/android/support/media/tv/Channel.java b/tv-provider/src/android/support/media/tv/Channel.java
index 2c12901..9b13e42 100644
--- a/tv-provider/src/android/support/media/tv/Channel.java
+++ b/tv-provider/src/android/support/media/tv/Channel.java
@@ -28,8 +28,6 @@
 import android.support.media.tv.TvContractCompat.Channels.ServiceType;
 import android.support.media.tv.TvContractCompat.Channels.Type;
 import android.support.media.tv.TvContractCompat.Channels.VideoFormat;
-import android.support.v4.os.BuildCompat;
-import android.text.TextUtils;
 
 import java.net.URISyntaxException;
 import java.nio.charset.Charset;
@@ -62,6 +60,21 @@
  *     }
  * }
  * </pre>
+ *
+ * <p>Usage example when updating an existing channel:
+ * <pre>
+ * Channel updatedChannel = new Channel.Builder(channel)
+ *         .setDescription("New channel description")
+ *         .build();
+ * getContentResolver().update(TvContractCompat.buildChannelUri(updatedChannel.getId()),
+ *         updatedChannel.toContentValues(), null, null);
+ * </pre>
+ *
+ * <p>Usage example when deleting a channel:
+ * <pre>
+ * getContentResolver().delete(
+ *         TvContractCompat.buildChannelUri(existingChannel.getId()), null, null);
+ * </pre>
  */
 @TargetApi(21)
 public final class Channel {
@@ -72,213 +85,167 @@
     public static final String[] PROJECTION = getProjection();
 
     private static final long INVALID_CHANNEL_ID = -1;
-    private static final int INVALID_INTEGER_VALUE = -1;
+    private static final int INVALID_INT_VALUE = -1;
     private static final int IS_SEARCHABLE = 1;
     private static final int IS_TRANSIENT = 1;
     private static final int IS_BROWSABLE = 1;
     private static final int IS_SYSTEM_APPROVED = 1;
     private static final int IS_LOCKED = 1;
 
-    private final long mId;
-    private final String mPackageName;
-    private final String mInputId;
-    private final String mType;
-    private final String mDisplayNumber;
-    private final String mDisplayName;
-    private final String mDescription;
-    private final String mVideoFormat;
-    private final int mOriginalNetworkId;
-    private final int mTransportStreamId;
-    private final int mServiceId;
-    private final String mAppLinkText;
-    private final int mAppLinkColor;
-    private final Uri mAppLinkIconUri;
-    private final Uri mAppLinkPosterArtUri;
-    private final Uri mAppLinkIntentUri;
-    private final byte[] mInternalProviderData;
-    private final String mNetworkAffiliation;
-    private final int mSearchable;
-    private final String mServiceType;
-    private final Long mInternalProviderFlag1;
-    private final Long mInternalProviderFlag2;
-    private final Long mInternalProviderFlag3;
-    private final Long mInternalProviderFlag4;
-    private final String mInternalProviderId;
-    private final int mTransient;
-    private final int mBrowsable;
-    private final int mSystemApproved;
-    private final int mLocked;
+    private ContentValues mValues;
 
     private Channel(Builder builder) {
-        mId = builder.mId;
-        mPackageName = builder.mPackageName;
-        mInputId = builder.mInputId;
-        mType = builder.mType;
-        mDisplayNumber = builder.mDisplayNumber;
-        mDisplayName = builder.mDisplayName;
-        mDescription = builder.mDescription;
-        mVideoFormat = builder.mVideoFormat;
-        mOriginalNetworkId = builder.mOriginalNetworkId;
-        mTransportStreamId = builder.mTransportStreamId;
-        mServiceId = builder.mServiceId;
-        mAppLinkText = builder.mAppLinkText;
-        mAppLinkColor = builder.mAppLinkColor;
-        mAppLinkIconUri = builder.mAppLinkIconUri;
-        mAppLinkPosterArtUri = builder.mAppLinkPosterArtUri;
-        mAppLinkIntentUri = builder.mAppLinkIntentUri;
-        mInternalProviderData = builder.mInternalProviderData;
-        mNetworkAffiliation = builder.mNetworkAffiliation;
-        mSearchable = builder.mSearchable;
-        mServiceType = builder.mServiceType;
-        mInternalProviderFlag1 = builder.mInternalProviderFlag1;
-        mInternalProviderFlag2 = builder.mInternalProviderFlag2;
-        mInternalProviderFlag3 = builder.mInternalProviderFlag3;
-        mInternalProviderFlag4 = builder.mInternalProviderFlag4;
-        mInternalProviderId = builder.mInternalProviderId;
-        mTransient = builder.mTransient;
-        mBrowsable = builder.mBrowsable;
-        mSystemApproved = builder.mSystemApproved;
-        mLocked = builder.mLocked;
+        mValues = builder.mValues;
     }
 
     /**
      * @return The value of {@link Channels#_ID} for the channel.
      */
     public long getId() {
-        return mId;
+        Long l = mValues.getAsLong(Channels._ID);
+        return l == null ? INVALID_CHANNEL_ID : l;
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_PACKAGE_NAME} for the channel.
      */
     public String getPackageName() {
-        return mPackageName;
+        return mValues.getAsString(Channels.COLUMN_PACKAGE_NAME);
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_INPUT_ID} for the channel.
      */
     public String getInputId() {
-        return mInputId;
+        return mValues.getAsString(Channels.COLUMN_INPUT_ID);
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_TYPE} for the channel.
      */
     public @Type String getType() {
-        return mType;
+        return mValues.getAsString(Channels.COLUMN_TYPE);
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_DISPLAY_NUMBER} for the channel.
      */
     public String getDisplayNumber() {
-        return mDisplayNumber;
+        return mValues.getAsString(Channels.COLUMN_DISPLAY_NUMBER);
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_DISPLAY_NAME} for the channel.
      */
     public String getDisplayName() {
-        return mDisplayName;
+        return mValues.getAsString(Channels.COLUMN_DISPLAY_NAME);
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_DESCRIPTION} for the channel.
      */
     public String getDescription() {
-        return mDescription;
+        return mValues.getAsString(Channels.COLUMN_DESCRIPTION);
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_VIDEO_FORMAT} for the channel.
      */
     public @VideoFormat String getVideoFormat() {
-        return mVideoFormat;
+        return mValues.getAsString(Channels.COLUMN_VIDEO_FORMAT);
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_ORIGINAL_NETWORK_ID} for the channel.
      */
     public int getOriginalNetworkId() {
-        return mOriginalNetworkId;
+        Integer i = mValues.getAsInteger(Channels.COLUMN_ORIGINAL_NETWORK_ID);
+        return i == null ? INVALID_INT_VALUE : i;
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_TRANSPORT_STREAM_ID} for the channel.
      */
     public int getTransportStreamId() {
-        return mTransportStreamId;
+        Integer i = mValues.getAsInteger(Channels.COLUMN_TRANSPORT_STREAM_ID);
+        return i == null ? INVALID_INT_VALUE : i;
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_SERVICE_ID} for the channel.
      */
     public int getServiceId() {
-        return mServiceId;
+        Integer i = mValues.getAsInteger(Channels.COLUMN_SERVICE_ID);
+        return i == null ? INVALID_INT_VALUE : i;
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_APP_LINK_TEXT} for the channel.
      */
     public String getAppLinkText() {
-        return mAppLinkText;
+        return mValues.getAsString(Channels.COLUMN_APP_LINK_TEXT);
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_APP_LINK_COLOR} for the channel.
      */
     public int getAppLinkColor() {
-        return mAppLinkColor;
+        Integer i = mValues.getAsInteger(Channels.COLUMN_APP_LINK_COLOR);
+        return i == null ? INVALID_INT_VALUE : i;
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_APP_LINK_ICON_URI} for the channel.
      */
     public Uri getAppLinkIconUri() {
-        return mAppLinkIconUri;
+        String uri = mValues.getAsString(Channels.COLUMN_APP_LINK_ICON_URI);
+        return uri == null ? null : Uri.parse(uri);
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_APP_LINK_POSTER_ART_URI} for the channel.
      */
     public Uri getAppLinkPosterArtUri() {
-        return mAppLinkPosterArtUri;
+        String uri = mValues.getAsString(Channels.COLUMN_APP_LINK_POSTER_ART_URI);
+        return uri == null ? null : Uri.parse(uri);
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_APP_LINK_INTENT_URI} for the channel.
      */
     public Uri getAppLinkIntentUri() {
-        return mAppLinkIntentUri;
+        String uri = mValues.getAsString(Channels.COLUMN_APP_LINK_INTENT_URI);
+        return uri == null ? null : Uri.parse(uri);
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_APP_LINK_INTENT_URI} for the program.
      */
     public Intent getAppLinkIntent() throws URISyntaxException {
-        return Intent.parseUri(mAppLinkIntentUri.toString(), Intent.URI_INTENT_SCHEME);
+        String uri = mValues.getAsString(Channels.COLUMN_APP_LINK_INTENT_URI);
+        return uri == null ? null : Intent.parseUri(uri.toString(), Intent.URI_INTENT_SCHEME);
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_NETWORK_AFFILIATION} for the channel.
      */
     public String getNetworkAffiliation() {
-        return mNetworkAffiliation;
+        return mValues.getAsString(Channels.COLUMN_NETWORK_AFFILIATION);
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_SEARCHABLE} for the channel.
      */
     public boolean isSearchable() {
-        return mSearchable == IS_SEARCHABLE;
+        Integer i = mValues.getAsInteger(Channels.COLUMN_SEARCHABLE);
+        return i == null || i == IS_SEARCHABLE;
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_INTERNAL_PROVIDER_DATA} for the channel.
      */
     public byte[] getInternalProviderDataByteArray() {
-        return mInternalProviderData;
+        return mValues.getAsByteArray(Channels.COLUMN_INTERNAL_PROVIDER_DATA);
     }
 
     /**
@@ -288,56 +255,58 @@
      * {@link Channels#SERVICE_TYPE_OTHER}.
      */
     public @ServiceType String getServiceType() {
-        return mServiceType;
+        return mValues.getAsString(Channels.COLUMN_SERVICE_TYPE);
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_INTERNAL_PROVIDER_FLAG1} for the channel.
      */
     public Long getInternalProviderFlag1() {
-        return mInternalProviderFlag1;
+        return mValues.getAsLong(Channels.COLUMN_INTERNAL_PROVIDER_FLAG1);
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_INTERNAL_PROVIDER_FLAG2} for the channel.
      */
     public Long getInternalProviderFlag2() {
-        return mInternalProviderFlag2;
+        return mValues.getAsLong(Channels.COLUMN_INTERNAL_PROVIDER_FLAG2);
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_INTERNAL_PROVIDER_FLAG3} for the channel.
      */
     public Long getInternalProviderFlag3() {
-        return mInternalProviderFlag3;
+        return mValues.getAsLong(Channels.COLUMN_INTERNAL_PROVIDER_FLAG3);
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_INTERNAL_PROVIDER_FLAG4} for the channel.
      */
     public Long getInternalProviderFlag4() {
-        return mInternalProviderFlag4;
+        return mValues.getAsLong(Channels.COLUMN_INTERNAL_PROVIDER_FLAG4);
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_INTERNAL_PROVIDER_ID} for the channel.
      */
     public String getInternalProviderId() {
-        return mInternalProviderId;
+        return mValues.getAsString(Channels.COLUMN_INTERNAL_PROVIDER_ID);
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_TRANSIENT} for the channel.
      */
     public boolean isTransient() {
-        return mTransient == IS_TRANSIENT;
+        Integer i = mValues.getAsInteger(Channels.COLUMN_TRANSIENT);
+        return i != null && i == IS_TRANSIENT;
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_BROWSABLE} for the channel.
      */
     public boolean isBrowsable() {
-        return mBrowsable == IS_BROWSABLE;
+        Integer i = mValues.getAsInteger(Channels.COLUMN_BROWSABLE);
+        return i != null && i == IS_BROWSABLE;
     }
 
     /**
@@ -346,28 +315,33 @@
      */
     @RestrictTo(LIBRARY_GROUP)
     public boolean isSystemApproved() {
-        return mSystemApproved == IS_SYSTEM_APPROVED;
+        Integer i = mValues.getAsInteger(Channels.COLUMN_SYSTEM_APPROVED);
+        return i != null && i == IS_SYSTEM_APPROVED;
     }
 
     /**
      * @return The value of {@link Channels#COLUMN_LOCKED} for the channel.
      */
     public boolean isLocked() {
-        return mLocked == IS_LOCKED;
+        Integer i = mValues.getAsInteger(Channels.COLUMN_LOCKED);
+        return i != null && i == IS_LOCKED;
     }
 
     @Override
+    public int hashCode() {
+        return mValues.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (!(other instanceof Channel)) {
+            return false;
+        }
+        return mValues.equals(((Channel) other).mValues);
+    }
+    @Override
     public String toString() {
-        return "Channel{"
-                + "id=" + mId
-                + ", packageName=" + mPackageName
-                + ", inputId=" + mInputId
-                + ", originalNetworkId=" + mOriginalNetworkId
-                + ", type=" + mType
-                + ", displayNumber=" + mDisplayNumber
-                + ", displayName=" + mDisplayName
-                + ", description=" + mDescription
-                + ", videoFormat=" + mVideoFormat + "}";
+        return "Channel{" + mValues.toString() + "}";
     }
 
     /**
@@ -387,105 +361,29 @@
      */
     @RestrictTo(LIBRARY_GROUP)
     public ContentValues toContentValues(boolean includeProtectedFields) {
-        ContentValues values = new ContentValues();
-        if (mId != INVALID_CHANNEL_ID) {
-            values.put(Channels._ID, mId);
+        ContentValues values = new ContentValues(mValues);
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
+            values.remove(Channels.COLUMN_APP_LINK_COLOR);
+            values.remove(Channels.COLUMN_APP_LINK_TEXT);
+            values.remove(Channels.COLUMN_APP_LINK_ICON_URI);
+            values.remove(Channels.COLUMN_APP_LINK_POSTER_ART_URI);
+            values.remove(Channels.COLUMN_APP_LINK_INTENT_URI);
+            values.remove(Channels.COLUMN_INTERNAL_PROVIDER_FLAG1);
+            values.remove(Channels.COLUMN_INTERNAL_PROVIDER_FLAG2);
+            values.remove(Channels.COLUMN_INTERNAL_PROVIDER_FLAG3);
+            values.remove(Channels.COLUMN_INTERNAL_PROVIDER_FLAG4);
         }
-        if (!TextUtils.isEmpty(mPackageName)) {
-            values.put(Channels.COLUMN_PACKAGE_NAME, mPackageName);
-        } else {
-            values.putNull(Channels.COLUMN_PACKAGE_NAME);
-        }
-        if (!TextUtils.isEmpty(mInputId)) {
-            values.put(Channels.COLUMN_INPUT_ID, mInputId);
-        } else {
-            values.putNull(Channels.COLUMN_INPUT_ID);
-        }
-        if (!TextUtils.isEmpty(mType)) {
-            values.put(Channels.COLUMN_TYPE, mType);
-        } else {
-            values.putNull(Channels.COLUMN_TYPE);
-        }
-        if (!TextUtils.isEmpty(mDisplayNumber)) {
-            values.put(Channels.COLUMN_DISPLAY_NUMBER, mDisplayNumber);
-        } else {
-            values.putNull(Channels.COLUMN_DISPLAY_NUMBER);
-        }
-        if (!TextUtils.isEmpty(mDisplayName)) {
-            values.put(Channels.COLUMN_DISPLAY_NAME, mDisplayName);
-        } else {
-            values.putNull(Channels.COLUMN_DISPLAY_NAME);
-        }
-        if (!TextUtils.isEmpty(mDescription)) {
-            values.put(Channels.COLUMN_DESCRIPTION, mDescription);
-        } else {
-            values.putNull(Channels.COLUMN_DESCRIPTION);
-        }
-        if (!TextUtils.isEmpty(mVideoFormat)) {
-            values.put(Channels.COLUMN_VIDEO_FORMAT, mVideoFormat);
-        } else {
-            values.putNull(Channels.COLUMN_VIDEO_FORMAT);
-        }
-        if (mInternalProviderData != null && mInternalProviderData.length > 0) {
-            values.put(Channels.COLUMN_INTERNAL_PROVIDER_DATA,
-                    mInternalProviderData);
-        } else {
-            values.putNull(Channels.COLUMN_INTERNAL_PROVIDER_DATA);
-        }
-        values.put(Channels.COLUMN_ORIGINAL_NETWORK_ID, mOriginalNetworkId);
-        values.put(Channels.COLUMN_TRANSPORT_STREAM_ID, mTransportStreamId);
-        values.put(Channels.COLUMN_SERVICE_ID, mServiceId);
-        values.put(Channels.COLUMN_NETWORK_AFFILIATION, mNetworkAffiliation);
-        values.put(Channels.COLUMN_SEARCHABLE, mSearchable);
-        values.put(Channels.COLUMN_SERVICE_TYPE, mServiceType);
-
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-            values.put(Channels.COLUMN_APP_LINK_COLOR, mAppLinkColor);
-            if (!TextUtils.isEmpty(mAppLinkText)) {
-                values.put(Channels.COLUMN_APP_LINK_TEXT, mAppLinkText);
-            } else {
-                values.putNull(Channels.COLUMN_APP_LINK_TEXT);
-            }
-            if (mAppLinkIconUri != null) {
-                values.put(Channels.COLUMN_APP_LINK_ICON_URI, mAppLinkIconUri.toString());
-            } else {
-                values.putNull(Channels.COLUMN_APP_LINK_ICON_URI);
-            }
-            if (mAppLinkPosterArtUri != null) {
-                values.put(Channels.COLUMN_APP_LINK_POSTER_ART_URI,
-                        mAppLinkPosterArtUri.toString());
-            } else {
-                values.putNull(Channels.COLUMN_APP_LINK_POSTER_ART_URI);
-            }
-            if (mAppLinkIntentUri != null) {
-                values.put(Channels.COLUMN_APP_LINK_INTENT_URI, mAppLinkIntentUri.toString());
-            } else {
-                values.putNull(Channels.COLUMN_APP_LINK_INTENT_URI);
-            }
-            if (mInternalProviderFlag1 != null) {
-                values.put(Channels.COLUMN_INTERNAL_PROVIDER_FLAG1, mInternalProviderFlag1);
-            }
-            if (mInternalProviderFlag2 != null) {
-                values.put(Channels.COLUMN_INTERNAL_PROVIDER_FLAG2, mInternalProviderFlag2);
-            }
-            if (mInternalProviderFlag3 != null) {
-                values.put(Channels.COLUMN_INTERNAL_PROVIDER_FLAG3, mInternalProviderFlag3);
-            }
-            if (mInternalProviderFlag4 != null) {
-                values.put(Channels.COLUMN_INTERNAL_PROVIDER_FLAG4, mInternalProviderFlag4);
-            }
-        }
-        if (BuildCompat.isAtLeastO()) {
-            values.put(Channels.COLUMN_INTERNAL_PROVIDER_ID, mInternalProviderId);
-            values.put(Channels.COLUMN_TRANSIENT, mTransient);
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
+            values.remove(Channels.COLUMN_INTERNAL_PROVIDER_ID);
+            values.remove(Channels.COLUMN_TRANSIENT);
         }
 
-        if (includeProtectedFields) {
-            values.put(Channels.COLUMN_BROWSABLE, mBrowsable);
-            values.put(Channels.COLUMN_LOCKED, mLocked);
-            if (BuildCompat.isAtLeastO()) {
-                values.put(Channels.COLUMN_SYSTEM_APPROVED, mSystemApproved);
-            }
+        if (!includeProtectedFields) {
+            values.remove(Channels.COLUMN_BROWSABLE);
+            values.remove(Channels.COLUMN_LOCKED);
+        }
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O || !includeProtectedFields) {
+            values.remove(Channels.COLUMN_SYSTEM_APPROVED);
         }
         return values;
     }
@@ -604,7 +502,7 @@
                 builder.setInternalProviderFlag4(cursor.getLong(index));
             }
         }
-        if (BuildCompat.isAtLeastO()) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             if ((index = cursor.getColumnIndex(Channels.COLUMN_INTERNAL_PROVIDER_ID)) >= 0
                     && !cursor.isNull(index)) {
                 builder.setInternalProviderId(cursor.getString(index));
@@ -657,7 +555,7 @@
                 Channels.COLUMN_TRANSIENT,
                 Channels.COLUMN_SYSTEM_APPROVED,
         };
-        if (BuildCompat.isAtLeastO()) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             return CollectionUtils.concatAll(baseColumns, marshmallowColumns, oReleaseColumns);
         }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
@@ -670,69 +568,14 @@
      * The builder class that makes it easy to chain setters to create a {@link Channel} object.
      */
     public static final class Builder {
-        private long mId = INVALID_CHANNEL_ID;
-        private String mPackageName;
-        private String mInputId;
-        private String mType;
-        private String mDisplayNumber;
-        private String mDisplayName;
-        private String mDescription;
-        private String mVideoFormat;
-        private int mOriginalNetworkId = INVALID_INTEGER_VALUE;
-        private int mTransportStreamId;
-        private int mServiceId;
-        private String mAppLinkText;
-        private int mAppLinkColor;
-        private Uri mAppLinkIconUri;
-        private Uri mAppLinkPosterArtUri;
-        private Uri mAppLinkIntentUri;
-        private byte[] mInternalProviderData;
-        private String mNetworkAffiliation;
-        private int mSearchable;
-        private String mServiceType = Channels.SERVICE_TYPE_AUDIO_VIDEO;
-        private Long mInternalProviderFlag1;
-        private Long mInternalProviderFlag2;
-        private Long mInternalProviderFlag3;
-        private Long mInternalProviderFlag4;
-        private String mInternalProviderId;
-        private int mTransient;
-        private int mBrowsable;
-        private int mSystemApproved;
-        private int mLocked;
+        private ContentValues mValues;
 
         public Builder() {
+            mValues = new ContentValues();
         }
 
         public Builder(Channel other) {
-            mId = other.mId;
-            mPackageName = other.mPackageName;
-            mInputId = other.mInputId;
-            mType = other.mType;
-            mDisplayNumber = other.mDisplayNumber;
-            mDisplayName = other.mDisplayName;
-            mDescription = other.mDescription;
-            mVideoFormat = other.mVideoFormat;
-            mOriginalNetworkId = other.mOriginalNetworkId;
-            mTransportStreamId = other.mTransportStreamId;
-            mServiceId = other.mServiceId;
-            mAppLinkText = other.mAppLinkText;
-            mAppLinkColor = other.mAppLinkColor;
-            mAppLinkIconUri = other.mAppLinkIconUri;
-            mAppLinkPosterArtUri = other.mAppLinkPosterArtUri;
-            mAppLinkIntentUri = other.mAppLinkIntentUri;
-            mInternalProviderData = other.mInternalProviderData;
-            mNetworkAffiliation = other.mNetworkAffiliation;
-            mSearchable = other.mSearchable;
-            mServiceType = other.mServiceType;
-            mInternalProviderFlag1 = other.mInternalProviderFlag1;
-            mInternalProviderFlag2 = other.mInternalProviderFlag2;
-            mInternalProviderFlag3 = other.mInternalProviderFlag3;
-            mInternalProviderFlag4 = other.mInternalProviderFlag4;
-            mInternalProviderId = other.mInternalProviderId;
-            mTransient = other.mTransient;
-            mBrowsable = other.mBrowsable;
-            mSystemApproved = other.mSystemApproved;
-            mLocked = other.mLocked;
+            mValues = new ContentValues(other.mValues);
         }
 
         /**
@@ -742,7 +585,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         private Builder setId(long id) {
-            mId = id;
+            mValues.put(Channels._ID, id);
             return this;
         }
 
@@ -755,7 +598,7 @@
          */
         @RestrictTo(LIBRARY_GROUP)
         Builder setPackageName(String packageName) {
-            mPackageName = packageName;
+            mValues.put(Channels.COLUMN_PACKAGE_NAME, packageName);
             return this;
         }
 
@@ -766,7 +609,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setInputId(String inputId) {
-            mInputId = inputId;
+            mValues.put(Channels.COLUMN_INPUT_ID, inputId);
             return this;
         }
 
@@ -777,7 +620,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setType(@Type String type) {
-            mType = type;
+            mValues.put(Channels.COLUMN_TYPE, type);
             return this;
         }
 
@@ -788,7 +631,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setDisplayNumber(String displayNumber) {
-            mDisplayNumber = displayNumber;
+            mValues.put(Channels.COLUMN_DISPLAY_NUMBER, displayNumber);
             return this;
         }
 
@@ -799,7 +642,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setDisplayName(String displayName) {
-            mDisplayName = displayName;
+            mValues.put(Channels.COLUMN_DISPLAY_NAME, displayName);
             return this;
         }
 
@@ -810,7 +653,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setDescription(String description) {
-            mDescription = description;
+            mValues.put(Channels.COLUMN_DESCRIPTION, description);
             return this;
         }
 
@@ -821,7 +664,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setVideoFormat(@VideoFormat String videoFormat) {
-            mVideoFormat = videoFormat;
+            mValues.put(Channels.COLUMN_VIDEO_FORMAT, videoFormat);
             return this;
         }
 
@@ -833,7 +676,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setOriginalNetworkId(int originalNetworkId) {
-            mOriginalNetworkId = originalNetworkId;
+            mValues.put(Channels.COLUMN_ORIGINAL_NETWORK_ID, originalNetworkId);
             return this;
         }
 
@@ -845,7 +688,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setTransportStreamId(int transportStreamId) {
-            mTransportStreamId = transportStreamId;
+            mValues.put(Channels.COLUMN_TRANSPORT_STREAM_ID, transportStreamId);
             return this;
         }
 
@@ -856,7 +699,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setServiceId(int serviceId) {
-            mServiceId = serviceId;
+            mValues.put(Channels.COLUMN_SERVICE_ID, serviceId);
             return this;
         }
 
@@ -868,7 +711,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setInternalProviderData(byte[] internalProviderData) {
-            mInternalProviderData = internalProviderData;
+            mValues.put(Channels.COLUMN_INTERNAL_PROVIDER_DATA, internalProviderData);
             return this;
         }
 
@@ -880,7 +723,8 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setInternalProviderData(String internalProviderData) {
-            mInternalProviderData = internalProviderData.getBytes(Charset.defaultCharset());
+            mValues.put(Channels.COLUMN_INTERNAL_PROVIDER_DATA,
+                    internalProviderData.getBytes(Charset.defaultCharset()));
             return this;
         }
 
@@ -891,7 +735,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setAppLinkText(String appLinkText) {
-            mAppLinkText = appLinkText;
+            mValues.put(Channels.COLUMN_APP_LINK_TEXT, appLinkText);
             return this;
         }
 
@@ -902,7 +746,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setAppLinkColor(int appLinkColor) {
-            mAppLinkColor = appLinkColor;
+            mValues.put(Channels.COLUMN_APP_LINK_COLOR, appLinkColor);
             return this;
         }
 
@@ -914,7 +758,8 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setAppLinkIconUri(Uri appLinkIconUri) {
-            mAppLinkIconUri = appLinkIconUri;
+            mValues.put(Channels.COLUMN_APP_LINK_ICON_URI,
+                    appLinkIconUri == null ? null : appLinkIconUri.toString());
             return this;
         }
 
@@ -926,7 +771,8 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setAppLinkPosterArtUri(Uri appLinkPosterArtUri) {
-            mAppLinkPosterArtUri = appLinkPosterArtUri;
+            mValues.put(Channels.COLUMN_APP_LINK_POSTER_ART_URI,
+                    appLinkPosterArtUri == null ? null : appLinkPosterArtUri.toString());
             return this;
         }
 
@@ -950,7 +796,8 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setAppLinkIntentUri(Uri appLinkIntentUri) {
-            mAppLinkIntentUri = appLinkIntentUri;
+            mValues.put(Channels.COLUMN_APP_LINK_INTENT_URI,
+                    appLinkIntentUri == null ? null : appLinkIntentUri.toString());
             return this;
         }
 
@@ -962,7 +809,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setNetworkAffiliation(String networkAffiliation) {
-            mNetworkAffiliation = networkAffiliation;
+            mValues.put(Channels.COLUMN_NETWORK_AFFILIATION, networkAffiliation);
             return this;
         }
 
@@ -973,7 +820,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setSearchable(boolean searchable) {
-            mSearchable = searchable ? IS_SEARCHABLE : 0;
+            mValues.put(Channels.COLUMN_SEARCHABLE, searchable ? IS_SEARCHABLE : 0);
             return this;
         }
 
@@ -986,7 +833,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setServiceType(@ServiceType String serviceType) {
-            mServiceType = serviceType;
+            mValues.put(Channels.COLUMN_SERVICE_TYPE, serviceType);
             return this;
         }
 
@@ -997,7 +844,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setInternalProviderFlag1(long flag) {
-            mInternalProviderFlag1 = flag;
+            mValues.put(Channels.COLUMN_INTERNAL_PROVIDER_FLAG1, flag);
             return this;
         }
 
@@ -1008,7 +855,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setInternalProviderFlag2(long flag) {
-            mInternalProviderFlag2 = flag;
+            mValues.put(Channels.COLUMN_INTERNAL_PROVIDER_FLAG2, flag);
             return this;
         }
 
@@ -1019,7 +866,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setInternalProviderFlag3(long flag) {
-            mInternalProviderFlag3 = flag;
+            mValues.put(Channels.COLUMN_INTERNAL_PROVIDER_FLAG3, flag);
             return this;
         }
 
@@ -1030,7 +877,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setInternalProviderFlag4(long flag) {
-            mInternalProviderFlag4 = flag;
+            mValues.put(Channels.COLUMN_INTERNAL_PROVIDER_FLAG4, flag);
             return this;
         }
 
@@ -1042,7 +889,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setInternalProviderId(String internalProviderId) {
-            mInternalProviderId = internalProviderId;
+            mValues.put(Channels.COLUMN_INTERNAL_PROVIDER_ID, internalProviderId);
             return this;
         }
 
@@ -1053,7 +900,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setTransient(boolean value) {
-            mTransient = value ? IS_TRANSIENT : 0;
+            mValues.put(Channels.COLUMN_TRANSIENT, value ? IS_TRANSIENT : 0);
             return this;
         }
 
@@ -1066,7 +913,7 @@
          */
         @RestrictTo(LIBRARY_GROUP)
         public Builder setBrowsable(boolean value) {
-            mBrowsable = value ? IS_BROWSABLE : 0;
+            mValues.put(Channels.COLUMN_BROWSABLE, value ? IS_BROWSABLE : 0);
             return this;
         }
 
@@ -1079,7 +926,7 @@
          */
         @RestrictTo(LIBRARY_GROUP)
         public Builder setSystemApproved(boolean value) {
-            mSystemApproved = value ? IS_SYSTEM_APPROVED : 0;
+            mValues.put(Channels.COLUMN_SYSTEM_APPROVED, value ? IS_SYSTEM_APPROVED : 0);
             return this;
         }
 
@@ -1092,7 +939,7 @@
          */
         @RestrictTo(LIBRARY_GROUP)
         public Builder setLocked(boolean value) {
-            mLocked = value ? IS_LOCKED : 0;
+            mValues.put(Channels.COLUMN_LOCKED, value ? IS_LOCKED : 0);
             return this;
         }
 
diff --git a/tv-provider/src/android/support/media/tv/PreviewProgram.java b/tv-provider/src/android/support/media/tv/PreviewProgram.java
index 4645a64..ad8e957 100644
--- a/tv-provider/src/android/support/media/tv/PreviewProgram.java
+++ b/tv-provider/src/android/support/media/tv/PreviewProgram.java
@@ -20,11 +20,10 @@
 import android.annotation.TargetApi;
 import android.content.ContentValues;
 import android.database.Cursor;
+import android.os.Build;
 import android.support.annotation.RestrictTo;
 import android.support.media.tv.TvContractCompat.PreviewPrograms;
 
-import java.util.Objects;
-
 /**
  * A convenience class to access {@link PreviewPrograms} entries in the system content
  * provider.
@@ -56,6 +55,21 @@
  *     }
  * }
  * </pre>
+ *
+ * <p>Usage example when updating an existing preview program:
+ * <pre>
+ * PreviewProgram updatedProgram = new PreviewProgram.Builder(previewProgram)
+ *         .setWeight(20)
+ *         .build();
+ * getContentResolver().update(TvContractCompat.buildPreviewProgramUri(updatedProgram.getId()),
+ *         updatedProgram.toContentValues(), null, null);
+ * </pre>
+ *
+ * <p>Usage example when deleting a preview program:
+ * <pre>
+ * getContentResolver().delete(TvContractCompat.buildPreviewProgramUri(existingProgram.getId()),
+ *         null, null);
+ * </pre>
  */
 @TargetApi(26)
 public final class PreviewProgram extends BasePreviewProgram {
@@ -68,27 +82,24 @@
     private static final long INVALID_LONG_VALUE = -1;
     private static final int INVALID_INT_VALUE = -1;
 
-    private final long mChannelId;
-    private final int mWeight;
-
     private PreviewProgram(Builder builder) {
         super(builder);
-        mChannelId = builder.mChannelId;
-        mWeight = builder.mWeight;
     }
 
     /**
      * @return The value of {@link PreviewPrograms#COLUMN_CHANNEL_ID} for the program.
      */
     public long getChannelId() {
-        return mChannelId;
+        Long l = mValues.getAsLong(PreviewPrograms.COLUMN_CHANNEL_ID);
+        return l == null ? INVALID_LONG_VALUE : l;
     }
 
     /**
      * @return The value of {@link PreviewPrograms#COLUMN_WEIGHT} for the program.
      */
     public int getWeight() {
-        return mWeight;
+        Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_WEIGHT);
+        return i == null ? INVALID_INT_VALUE : i;
     }
 
     @Override
@@ -96,19 +107,12 @@
         if (!(other instanceof PreviewProgram)) {
             return false;
         }
-        if (!super.equals(other)) {
-            return false;
-        }
-        PreviewProgram program = (PreviewProgram) other;
-        return mChannelId == program.mChannelId && Objects.equals(mWeight, program.mWeight);
+        return mValues.equals(((PreviewProgram) other).mValues);
     }
 
     @Override
     public String toString() {
-        return "Program{"
-                + ", channelId=" + mChannelId
-                + ", weight=" + mWeight
-                + "}";
+        return "PreviewProgram{" + mValues.toString() + "}";
     }
 
     /**
@@ -131,13 +135,9 @@
     @Override
     public ContentValues toContentValues(boolean includeProtectedFields) {
         ContentValues values = super.toContentValues(includeProtectedFields);
-        if (mChannelId != INVALID_LONG_VALUE) {
-            values.put(PreviewPrograms.COLUMN_CHANNEL_ID, mChannelId);
-        } else {
-            values.putNull(PreviewPrograms.COLUMN_CHANNEL_ID);
-        }
-        if (mWeight != INVALID_INT_VALUE) {
-            values.put(PreviewPrograms.COLUMN_WEIGHT, mWeight);
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
+            values.remove(PreviewPrograms.COLUMN_CHANNEL_ID);
+            values.remove(PreviewPrograms.COLUMN_WEIGHT);
         }
         return values;
     }
@@ -177,8 +177,6 @@
      * This Builder class simplifies the creation of a {@link PreviewProgram} object.
      */
     public static final class Builder extends BasePreviewProgram.Builder<Builder> {
-        private long mChannelId = INVALID_LONG_VALUE;
-        private int mWeight = INVALID_INT_VALUE;
 
         /**
          * Creates a new Builder object.
@@ -191,9 +189,7 @@
          * @param other The Program you're copying from.
          */
         public Builder(PreviewProgram other) {
-            super(other);
-            mChannelId = other.mChannelId;
-            mWeight = other.mWeight;
+            mValues = new ContentValues(other.mValues);
         }
 
         /**
@@ -203,7 +199,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setChannelId(long channelId) {
-            mChannelId = channelId;
+            mValues.put(PreviewPrograms.COLUMN_CHANNEL_ID, channelId);
             return this;
         }
 
@@ -214,7 +210,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setWeight(int weight) {
-            mWeight = weight;
+            mValues.put(PreviewPrograms.COLUMN_WEIGHT, weight);
             return this;
         }
 
diff --git a/tv-provider/src/android/support/media/tv/Program.java b/tv-provider/src/android/support/media/tv/Program.java
index b82555f..8dda52d 100644
--- a/tv-provider/src/android/support/media/tv/Program.java
+++ b/tv-provider/src/android/support/media/tv/Program.java
@@ -25,9 +25,6 @@
 import android.support.annotation.RestrictTo;
 import android.support.media.tv.TvContractCompat.Programs;
 
-import java.util.Arrays;
-import java.util.Objects;
-
 /**
  * A convenience class to access {@link TvContractCompat.Programs} entries in the system content
  * provider.
@@ -57,6 +54,21 @@
  *     }
  * }
  * </pre>
+ *
+ * <p>Usage example when updating an existing program:
+ * <pre>
+ * Program updatedProgram = new Program.Builder(program)
+ *         .setEndTimeUtcMillis(newProgramEndTime)
+ *         .build();
+ * getContentResolver().update(TvContractCompat.buildProgramUri(updatedProgram.getId()),
+ *         updatedProgram.toContentValues(), null, null);
+ * </pre>
+ *
+ * <p>Usage example when deleting a program:
+ * <pre>
+ * getContentResolver().delete(TvContractCompat.buildProgramUri(existingProgram.getId()),
+ *         null, null);
+ * </pre>
  */
 @TargetApi(21)
 public final class Program extends BaseProgram implements Comparable<Program> {
@@ -67,62 +79,54 @@
     public static final String[] PROJECTION = getProjection();
 
     private static final long INVALID_LONG_VALUE = -1;
-    private static final int INVALID_INT_VALUE = -1;
     private static final int IS_RECORDING_PROHIBITED = 1;
 
-    private final long mChannelId;
-    private final long mStartTimeUtcMillis;
-    private final long mEndTimeUtcMillis;
-    private final String[] mBroadcastGenres;
-    private final int mRecordingProhibited;
-
     private Program(Builder builder) {
         super(builder);
-        mChannelId = builder.mChannelId;
-        mStartTimeUtcMillis = builder.mStartTimeUtcMillis;
-        mEndTimeUtcMillis = builder.mEndTimeUtcMillis;
-        mBroadcastGenres = builder.mBroadcastGenres;
-        mRecordingProhibited = builder.mRecordingProhibited;
     }
 
     /**
      * @return The value of {@link Programs#COLUMN_CHANNEL_ID} for the program.
      */
     public long getChannelId() {
-        return mChannelId;
+        Long l = mValues.getAsLong(Programs.COLUMN_CHANNEL_ID);
+        return l == null ? INVALID_LONG_VALUE : l;
     }
 
     /**
      * @return The value of {@link Programs#COLUMN_START_TIME_UTC_MILLIS} for the program.
      */
     public long getStartTimeUtcMillis() {
-        return mStartTimeUtcMillis;
+        Long l = mValues.getAsLong(Programs.COLUMN_START_TIME_UTC_MILLIS);
+        return l == null ? INVALID_LONG_VALUE : l;
     }
 
     /**
      * @return The value of {@link Programs#COLUMN_END_TIME_UTC_MILLIS} for the program.
      */
     public long getEndTimeUtcMillis() {
-        return mEndTimeUtcMillis;
+        Long l = mValues.getAsLong(Programs.COLUMN_END_TIME_UTC_MILLIS);
+        return l == null ? INVALID_LONG_VALUE : l;
     }
 
     /**
      * @return The value of {@link Programs#COLUMN_BROADCAST_GENRE} for the program.
      */
     public String[] getBroadcastGenres() {
-        return mBroadcastGenres;
+        return Programs.Genres.decode(mValues.getAsString(Programs.COLUMN_BROADCAST_GENRE));
     }
 
     /**
      * @return The value of {@link Programs#COLUMN_RECORDING_PROHIBITED} for the program.
      */
     public boolean isRecordingProhibited() {
-        return mRecordingProhibited == IS_RECORDING_PROHIBITED;
+        Integer i = mValues.getAsInteger(Programs.COLUMN_RECORDING_PROHIBITED);
+        return i != null && i == IS_RECORDING_PROHIBITED;
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(super.hashCode(), mChannelId, mStartTimeUtcMillis, mEndTimeUtcMillis);
+        return mValues.hashCode();
     }
 
     @Override
@@ -130,16 +134,7 @@
         if (!(other instanceof Program)) {
             return false;
         }
-        if (!super.equals(other)) {
-            return false;
-        }
-        Program program = (Program) other;
-        return mChannelId == program.mChannelId
-                && mStartTimeUtcMillis == program.mStartTimeUtcMillis
-                && mEndTimeUtcMillis == program.mEndTimeUtcMillis
-                && Arrays.equals(mBroadcastGenres, program.mBroadcastGenres)
-                && (Build.VERSION.SDK_INT < Build.VERSION_CODES.N
-                        || Objects.equals(mRecordingProhibited, program.mRecordingProhibited));
+        return mValues.equals(((Program) other).mValues);
     }
 
     /**
@@ -148,16 +143,13 @@
      */
     @Override
     public int compareTo(@NonNull Program other) {
-        return Long.compare(mStartTimeUtcMillis, other.mStartTimeUtcMillis);
+        return Long.compare(mValues.getAsLong(Programs.COLUMN_START_TIME_UTC_MILLIS),
+                other.mValues.getAsLong(Programs.COLUMN_START_TIME_UTC_MILLIS));
     }
 
     @Override
     public String toString() {
-        return "Program{"
-                + "channelId=" + mChannelId
-                + ", startTimeUtcSec=" + mStartTimeUtcMillis
-                + ", endTimeUtcSec=" + mEndTimeUtcMillis
-                + "}";
+        return "Program{" + mValues.toString() + "}";
     }
 
     /**
@@ -167,31 +159,8 @@
     @Override
     public ContentValues toContentValues() {
         ContentValues values = super.toContentValues();
-        if (mChannelId != INVALID_LONG_VALUE) {
-            values.put(Programs.COLUMN_CHANNEL_ID, mChannelId);
-        } else {
-            values.putNull(Programs.COLUMN_CHANNEL_ID);
-        }
-        if (mBroadcastGenres != null && mBroadcastGenres.length > 0) {
-            values.put(Programs.COLUMN_BROADCAST_GENRE,
-                    Programs.Genres.encode(mBroadcastGenres));
-        } else {
-            values.putNull(Programs.COLUMN_BROADCAST_GENRE);
-        }
-        if (mStartTimeUtcMillis != INVALID_LONG_VALUE) {
-            values.put(Programs.COLUMN_START_TIME_UTC_MILLIS, mStartTimeUtcMillis);
-        } else {
-            values.putNull(Programs.COLUMN_START_TIME_UTC_MILLIS);
-        }
-        if (mEndTimeUtcMillis != INVALID_LONG_VALUE) {
-            values.put(Programs.COLUMN_END_TIME_UTC_MILLIS, mEndTimeUtcMillis);
-        } else {
-            values.putNull(Programs.COLUMN_END_TIME_UTC_MILLIS);
-        }
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-            if (mRecordingProhibited != INVALID_INT_VALUE) {
-                values.put(Programs.COLUMN_RECORDING_PROHIBITED, mRecordingProhibited);
-            }
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
+            values.remove(Programs.COLUMN_RECORDING_PROHIBITED);
         }
         return values;
     }
@@ -254,11 +223,6 @@
      * This Builder class simplifies the creation of a {@link Program} object.
      */
     public static class Builder extends BaseProgram.Builder<Builder> {
-        private long mChannelId = INVALID_LONG_VALUE;
-        private long mStartTimeUtcMillis = INVALID_LONG_VALUE;
-        private long mEndTimeUtcMillis = INVALID_LONG_VALUE;
-        private String[] mBroadcastGenres;
-        private int mRecordingProhibited = INVALID_INT_VALUE;
 
         /**
          * Creates a new Builder object.
@@ -271,12 +235,7 @@
          * @param other The Program you're copying from.
          */
         public Builder(Program other) {
-            super(other);
-            mChannelId = other.mChannelId;
-            mStartTimeUtcMillis = other.mStartTimeUtcMillis;
-            mEndTimeUtcMillis = other.mEndTimeUtcMillis;
-            mBroadcastGenres = other.mBroadcastGenres;
-            mRecordingProhibited = other.mRecordingProhibited;
+            mValues = new ContentValues(other.mValues);
         }
 
         /**
@@ -286,7 +245,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setChannelId(long channelId) {
-            mChannelId = channelId;
+            mValues.put(Programs.COLUMN_CHANNEL_ID, channelId);
             return this;
         }
 
@@ -298,7 +257,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setStartTimeUtcMillis(long startTimeUtcMillis) {
-            mStartTimeUtcMillis = startTimeUtcMillis;
+            mValues.put(Programs.COLUMN_START_TIME_UTC_MILLIS, startTimeUtcMillis);
             return this;
         }
 
@@ -310,7 +269,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setEndTimeUtcMillis(long endTimeUtcMillis) {
-            mEndTimeUtcMillis = endTimeUtcMillis;
+            mValues.put(Programs.COLUMN_END_TIME_UTC_MILLIS, endTimeUtcMillis);
             return this;
         }
 
@@ -323,7 +282,7 @@
          * @see Programs#COLUMN_BROADCAST_GENRE
          */
         public Builder setBroadcastGenres(String[] genres) {
-            mBroadcastGenres = genres;
+            mValues.put(Programs.COLUMN_BROADCAST_GENRE, Programs.Genres.encode(genres));
             return this;
         }
 
@@ -335,7 +294,8 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setRecordingProhibited(boolean prohibited) {
-            mRecordingProhibited = prohibited ? IS_RECORDING_PROHIBITED : 0;
+            mValues.put(Programs.COLUMN_RECORDING_PROHIBITED,
+                    prohibited ? IS_RECORDING_PROHIBITED : 0);
             return this;
         }
 
diff --git a/tv-provider/src/android/support/media/tv/TvContractCompat.java b/tv-provider/src/android/support/media/tv/TvContractCompat.java
index 81a6b34..d108ade 100644
--- a/tv-provider/src/android/support/media/tv/TvContractCompat.java
+++ b/tv-provider/src/android/support/media/tv/TvContractCompat.java
@@ -27,15 +27,16 @@
 import android.media.tv.TvContentRating;
 import android.media.tv.TvContract;
 import android.net.Uri;
+import android.os.Build;
 import android.os.Bundle;
 import android.provider.BaseColumns;
 import android.support.annotation.IntDef;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.annotation.RequiresApi;
 import android.support.annotation.RestrictTo;
 import android.support.annotation.StringDef;
 import android.support.media.tv.TvContractCompat.Programs.Genres;
-import android.support.v4.os.BuildCompat;
 import android.text.TextUtils;
 
 import java.lang.annotation.Retention;
@@ -567,8 +568,9 @@
      * @param channelId The channel ID to be browsable.
      * @see Channels#COLUMN_BROWSABLE
      */
+    @RequiresApi(api = 26)
     public static void requestChannelBrowsable(Context context, long channelId) {
-        if (BuildCompat.isAtLeastO()) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             TvContract.requestChannelBrowsable(context, channelId);
         }
     }
diff --git a/tv-provider/src/android/support/media/tv/WatchNextProgram.java b/tv-provider/src/android/support/media/tv/WatchNextProgram.java
index b7c9666..b0b6b1c 100644
--- a/tv-provider/src/android/support/media/tv/WatchNextProgram.java
+++ b/tv-provider/src/android/support/media/tv/WatchNextProgram.java
@@ -20,12 +20,11 @@
 import android.annotation.TargetApi;
 import android.content.ContentValues;
 import android.database.Cursor;
+import android.os.Build;
 import android.support.annotation.RestrictTo;
 import android.support.media.tv.TvContractCompat.WatchNextPrograms;
 import android.support.media.tv.TvContractCompat.WatchNextPrograms.WatchNextType;
 
-import java.util.Objects;
-
 /**
  * A convenience class to access {@link WatchNextPrograms} entries in the system content
  * provider.
@@ -57,6 +56,21 @@
  *     }
  * }
  * </pre>
+ *
+ * <p>Usage example when updating an existing "watch next" program:
+ * <pre>
+ * WatchNextProgram updatedProgram = new WatchNextProgram.Builder(watchNextProgram)
+ *         .setLastEngagementTimeUtcMillis(System.currentTimeMillis())
+ *         .build();
+ * getContentResolver().update(TvContractCompat.buildWatchNextProgramUri(updatedProgram.getId()),
+ *         updatedProgram.toContentValues(), null, null);
+ * </pre>
+ *
+ * <p>Usage example when deleting a "watch next" program:
+ * <pre>
+ * getContentResolver().delete(TvContractCompat.buildWatchNextProgramUri(existingProgram.getId()),
+ *         null, null);
+ * </pre>
  */
 @TargetApi(26)
 public final class WatchNextProgram extends BasePreviewProgram {
@@ -69,20 +83,16 @@
     private static final long INVALID_LONG_VALUE = -1;
     private static final int INVALID_INT_VALUE = -1;
 
-    private final int mWatchNextType;
-    private final long mLastEngagementTimeUtcMillis;
-
     private WatchNextProgram(Builder builder) {
         super(builder);
-        mWatchNextType = builder.mWatchNextType;
-        mLastEngagementTimeUtcMillis = builder.mLastEngagementTimeUtcMillis;
     }
 
     /**
      * @return The value of {@link WatchNextPrograms#COLUMN_WATCH_NEXT_TYPE} for the program.
      */
     public @WatchNextType int getWatchNextType() {
-        return mWatchNextType;
+        Integer i = mValues.getAsInteger(WatchNextPrograms.COLUMN_WATCH_NEXT_TYPE);
+        return i == null ? INVALID_INT_VALUE : i;
     }
 
     /**
@@ -90,7 +100,8 @@
      * program.
      */
     public long getLastEngagementTimeUtcMillis() {
-        return mLastEngagementTimeUtcMillis;
+        Long l = mValues.getAsLong(WatchNextPrograms.COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS);
+        return l == null ? INVALID_LONG_VALUE : l;
     }
 
     @Override
@@ -98,20 +109,12 @@
         if (!(other instanceof WatchNextProgram)) {
             return false;
         }
-        if (!super.equals(other)) {
-            return false;
-        }
-        WatchNextProgram program = (WatchNextProgram) other;
-        return Objects.equals(mWatchNextType, program.mWatchNextType)
-                && mLastEngagementTimeUtcMillis == program.mLastEngagementTimeUtcMillis;
+        return mValues.equals(((WatchNextProgram) other).mValues);
     }
 
     @Override
     public String toString() {
-        return "Program{"
-                + ", watchNextType=" + mWatchNextType
-                + ", lastEngagementTimeUtcMillis=" + mLastEngagementTimeUtcMillis
-                + "}";
+        return "WatchNextProgram{" + mValues.toString() + "}";
     }
 
     /**
@@ -134,12 +137,9 @@
     @Override
     public ContentValues toContentValues(boolean includeProtectedFields) {
         ContentValues values = super.toContentValues(includeProtectedFields);
-        if (mWatchNextType != INVALID_INT_VALUE) {
-            values.put(WatchNextPrograms.COLUMN_WATCH_NEXT_TYPE, mWatchNextType);
-        }
-        if (mLastEngagementTimeUtcMillis != INVALID_LONG_VALUE) {
-            values.put(WatchNextPrograms.COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS,
-                    mLastEngagementTimeUtcMillis);
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
+            values.remove(WatchNextPrograms.COLUMN_WATCH_NEXT_TYPE);
+            values.remove(WatchNextPrograms.COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS);
         }
         return values;
     }
@@ -180,8 +180,6 @@
      * This Builder class simplifies the creation of a {@link WatchNextProgram} object.
      */
     public static final class Builder extends BasePreviewProgram.Builder<Builder> {
-        private int mWatchNextType = INVALID_INT_VALUE;
-        private long mLastEngagementTimeUtcMillis = INVALID_LONG_VALUE;
 
         /**
          * Creates a new Builder object.
@@ -194,9 +192,7 @@
          * @param other The Program you're copying from.
          */
         public Builder(WatchNextProgram other) {
-            super(other);
-            mWatchNextType = other.mWatchNextType;
-            mLastEngagementTimeUtcMillis = other.mLastEngagementTimeUtcMillis;
+            mValues = new ContentValues(other.mValues);
         }
 
         /**
@@ -212,7 +208,7 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setWatchNextType(@WatchNextType int watchNextType) {
-            mWatchNextType = watchNextType;
+            mValues.put(WatchNextPrograms.COLUMN_WATCH_NEXT_TYPE, watchNextType);
             return this;
         }
 
@@ -224,7 +220,8 @@
          * @return This Builder object to allow for chaining of calls to builder methods.
          */
         public Builder setLastEngagementTimeUtcMillis(long lastEngagementTimeUtcMillis) {
-            mLastEngagementTimeUtcMillis = lastEngagementTimeUtcMillis;
+            mValues.put(WatchNextPrograms.COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS,
+                    lastEngagementTimeUtcMillis);
             return this;
         }
 
diff --git a/tv-provider/tests/src/android/support/media/tv/ChannelTest.java b/tv-provider/tests/src/android/support/media/tv/ChannelTest.java
index 88dc405..82d3a61 100644
--- a/tv-provider/tests/src/android/support/media/tv/ChannelTest.java
+++ b/tv-provider/tests/src/android/support/media/tv/ChannelTest.java
@@ -26,7 +26,6 @@
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SdkSuppress;
 import android.support.test.filters.SmallTest;
-import android.support.v4.os.BuildCompat;
 
 import junit.framework.TestCase;
 
@@ -102,14 +101,65 @@
         Uri channelUri = resolver.insert(Channels.CONTENT_URI, contentValues);
         assertNotNull(channelUri);
 
-        Channel channelFromSystemDb;
-        try (Cursor cursor = resolver.query(channelUri, Channel.PROJECTION, null, null, null)) {
+        Channel channelFromSystemDb = loadChannelFromContentProvider(resolver, channelUri);
+        compareChannel(fullyPopulatedChannel, channelFromSystemDb, false);
+    }
+
+    @Test
+    public void testChannelUpdateWithContentProvider() {
+        if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) {
+            return;
+        }
+
+        Channel fullyPopulatedChannel = createFullyPopulatedChannel();
+        ContentValues contentValues = fullyPopulatedChannel.toContentValues();
+        ContentResolver resolver = InstrumentationRegistry.getContext().getContentResolver();
+        Uri channelUri = resolver.insert(Channels.CONTENT_URI, contentValues);
+        assertNotNull(channelUri);
+
+        Channel channelFromSystemDb = loadChannelFromContentProvider(resolver, channelUri);
+        compareChannel(fullyPopulatedChannel, channelFromSystemDb, false);
+
+        // Update a field from a fully loaded channel.
+        Channel updatedChannel = new Channel.Builder(channelFromSystemDb)
+                .setDescription("new description").build();
+        assertEquals(1, resolver.update(channelUri, updatedChannel.toContentValues(), null, null));
+        channelFromSystemDb = loadChannelFromContentProvider(resolver, channelUri);
+        compareChannel(updatedChannel, channelFromSystemDb, false);
+
+        // Update a field with null from a fully loaded channel.
+        updatedChannel = new Channel.Builder(updatedChannel)
+                .setAppLinkText(null).build();
+        assertEquals(1, resolver.update(
+                channelUri, updatedChannel.toContentValues(), null, null));
+        channelFromSystemDb = loadChannelFromContentProvider(resolver, channelUri);
+        compareChannel(updatedChannel, channelFromSystemDb, false);
+
+        // Update a field without referencing fully channel.
+        ContentValues values = new Channel.Builder().setDisplayName("abc").build()
+                .toContentValues();
+        assertEquals(1, values.size());
+        assertEquals(1, resolver.update(channelUri, values, null, null));
+        channelFromSystemDb = loadChannelFromContentProvider(resolver, channelUri);
+        Channel expectedChannel = new Channel.Builder(channelFromSystemDb)
+                .setDisplayName("abc").build();
+        compareChannel(expectedChannel, channelFromSystemDb, false);
+    }
+
+    @Test
+    public void testChannelEquals() {
+        assertEquals(createFullyPopulatedChannel(), createFullyPopulatedChannel());
+    }
+
+
+    private static Channel loadChannelFromContentProvider(
+            ContentResolver resolver, Uri channelUri) {
+        try (Cursor cursor = resolver.query(channelUri, null, null, null, null)) {
             assertNotNull(cursor);
             assertEquals(1, cursor.getCount());
             cursor.moveToNext();
-            channelFromSystemDb = Channel.fromCursor(cursor);
+            return Channel.fromCursor(cursor);
         }
-        compareChannel(fullyPopulatedChannel, channelFromSystemDb, false);
     }
 
     private static Channel createFullyPopulatedChannel() {
@@ -166,7 +216,7 @@
             assertEquals(channelA.getAppLinkPosterArtUri(), channelB.getAppLinkPosterArtUri());
             assertEquals(channelA.getAppLinkText(), channelB.getAppLinkText());
         }
-        if (BuildCompat.isAtLeastO()) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             assertEquals(channelA.getInternalProviderId(), channelB.getInternalProviderId());
             assertEquals(channelA.isTransient(), channelB.isTransient());
         }
@@ -177,11 +227,10 @@
             // protected fields since they only can be modified by system apps.
             assertEquals(channelA.isBrowsable(), channelB.isBrowsable());
             assertEquals(channelA.isLocked(), channelB.isLocked());
-            if (BuildCompat.isAtLeastO()) {
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                 assertEquals(channelA.isSystemApproved(), channelB.isSystemApproved());
             }
             assertEquals(channelA.toContentValues(), channelB.toContentValues());
-            assertEquals(channelA.toString(), channelB.toString());
         }
     }
 
diff --git a/tv-provider/tests/src/android/support/media/tv/PreviewProgramTest.java b/tv-provider/tests/src/android/support/media/tv/PreviewProgramTest.java
index e8a7bdd..e222e40 100644
--- a/tv-provider/tests/src/android/support/media/tv/PreviewProgramTest.java
+++ b/tv-provider/tests/src/android/support/media/tv/PreviewProgramTest.java
@@ -15,6 +15,7 @@
  */
 package android.support.media.tv;
 
+import android.annotation.TargetApi;
 import android.content.ContentResolver;
 import android.content.ContentUris;
 import android.content.ContentValues;
@@ -26,8 +27,8 @@
 import android.support.media.tv.TvContractCompat.Channels;
 import android.support.media.tv.TvContractCompat.PreviewPrograms;
 import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SdkSuppress;
 import android.support.test.filters.SmallTest;
-import android.support.v4.os.BuildCompat;
 
 import junit.framework.TestCase;
 
@@ -42,14 +43,12 @@
  * values from them.
  */
 @SmallTest
+@SdkSuppress(minSdkVersion = 26)
+@TargetApi(26)
 public class PreviewProgramTest extends TestCase {
 
     @Override
     protected void tearDown() {
-        // TODO: Use @SdkSuppress once Build.VERSION_CODES.O has a right value.
-        if (!BuildCompat.isAtLeastO()) {
-            return;
-        }
         if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) {
             return;
         }
@@ -59,9 +58,6 @@
 
     @Test
     public void testEmptyPreviewProgram() {
-        if (!BuildCompat.isAtLeastO()) {
-            return;
-        }
         PreviewProgram emptyProgram = new PreviewProgram.Builder().build();
         ContentValues contentValues = emptyProgram.toContentValues();
         compareProgram(emptyProgram,
@@ -71,9 +67,6 @@
 
     @Test
     public void testSampleProgram() {
-        if (!BuildCompat.isAtLeastO()) {
-            return;
-        }
         PreviewProgram sampleProgram = new PreviewProgram.Builder()
                 .setPackageName("My package")
                 .setTitle("Program Title")
@@ -94,10 +87,7 @@
     }
 
     @Test
-    public void testFullyPopulatedProgram() {
-        if (!BuildCompat.isAtLeastO()) {
-            return;
-        }
+    public void testFullyPopulatedPreviewProgram() {
         PreviewProgram fullyPopulatedProgram = createFullyPopulatedPreviewProgram(3);
         ContentValues contentValues = fullyPopulatedProgram.toContentValues(true);
         compareProgram(fullyPopulatedProgram,
@@ -110,10 +100,7 @@
     }
 
     @Test
-    public void testChannelWithSystemContentProvider() {
-        if (!BuildCompat.isAtLeastO()) {
-            return;
-        }
+    public void testPreviewProgramWithSystemContentProvider() {
         if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) {
             return;
         }
@@ -130,21 +117,77 @@
         Uri previewProgramUri = resolver.insert(PreviewPrograms.CONTENT_URI,
                 fullyPopulatedProgram.toContentValues());
 
-        PreviewProgram programFromSystemDb;
-        try (Cursor cursor = resolver.query(previewProgramUri, null, null, null, null)) {
-            assertNotNull(cursor);
-            assertEquals(1, cursor.getCount());
-            cursor.moveToNext();
-            programFromSystemDb = PreviewProgram.fromCursor(cursor);
-        }
+        PreviewProgram programFromSystemDb =
+                loadPreviewProgramFromContentProvider(resolver, previewProgramUri);
         compareProgram(fullyPopulatedProgram, programFromSystemDb, false);
     }
 
     @Test
-    public void testPreviewProgramWithPartialData() {
-        if (!BuildCompat.isAtLeastO()) {
+    public void testPreviewProgramUpdateWithContentProvider() {
+        if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) {
             return;
         }
+        Channel channel = new Channel.Builder()
+                .setInputId("TestInputService")
+                .setType(TvContractCompat.Channels.TYPE_PREVIEW)
+                .build();
+        ContentResolver resolver = InstrumentationRegistry.getContext().getContentResolver();
+        Uri channelUri = resolver.insert(Channels.CONTENT_URI, channel.toContentValues());
+        assertNotNull(channelUri);
+
+        PreviewProgram fullyPopulatedProgram = createFullyPopulatedPreviewProgram(
+                ContentUris.parseId(channelUri));
+        Uri previewProgramUri = resolver.insert(PreviewPrograms.CONTENT_URI,
+                fullyPopulatedProgram.toContentValues());
+
+        PreviewProgram programFromSystemDb = loadPreviewProgramFromContentProvider(
+                resolver, previewProgramUri);
+        compareProgram(fullyPopulatedProgram, programFromSystemDb, false);
+
+        // Update a field from a fully loaded preview program.
+        PreviewProgram updatedProgram = new PreviewProgram.Builder(programFromSystemDb)
+                .setInteractionCount(programFromSystemDb.getInteractionCount() + 1).build();
+        assertEquals(1, resolver.update(
+                previewProgramUri, updatedProgram.toContentValues(), null, null));
+        programFromSystemDb = loadPreviewProgramFromContentProvider(resolver, previewProgramUri);
+        compareProgram(updatedProgram, programFromSystemDb, false);
+
+        // Update a field with null from a fully loaded preview program.
+        updatedProgram = new PreviewProgram.Builder(updatedProgram)
+                .setLongDescription(null).build();
+        assertEquals(1, resolver.update(
+                previewProgramUri, updatedProgram.toContentValues(), null, null));
+        programFromSystemDb = loadPreviewProgramFromContentProvider(resolver, previewProgramUri);
+        compareProgram(updatedProgram, programFromSystemDb, false);
+
+        // Update a field without referencing fully loaded preview program.
+        ContentValues values = new PreviewProgram.Builder().setInteractionCount(1).build()
+                .toContentValues();
+        assertEquals(1, values.size());
+        assertEquals(1, resolver.update(previewProgramUri, values, null, null));
+        programFromSystemDb = loadPreviewProgramFromContentProvider(resolver, previewProgramUri);
+        PreviewProgram expectedProgram = new PreviewProgram.Builder(programFromSystemDb)
+                .setInteractionCount(1).build();
+        compareProgram(expectedProgram, programFromSystemDb, false);
+    }
+
+    @Test
+    public void testPreviewProgramEquals() {
+        assertEquals(createFullyPopulatedPreviewProgram(1), createFullyPopulatedPreviewProgram(1));
+    }
+
+    private static PreviewProgram loadPreviewProgramFromContentProvider(
+            ContentResolver resolver, Uri previewProgramUri) {
+        try (Cursor cursor = resolver.query(previewProgramUri, null, null, null, null)) {
+            assertNotNull(cursor);
+            assertEquals(1, cursor.getCount());
+            cursor.moveToNext();
+            return PreviewProgram.fromCursor(cursor);
+        }
+    }
+
+    @Test
+    public void testPreviewProgramWithPartialData() {
         PreviewProgram previewProgram = new PreviewProgram.Builder()
                 .setChannelId(3)
                 .setWeight(100)
@@ -314,7 +357,6 @@
         assertEquals(programA.getReviewRatingStyle(), programB.getReviewRatingStyle());
         assertEquals(programA.getReviewRating(), programB.getReviewRating());
         assertEquals(programA.getContentId(), programB.getContentId());
-        assertEquals(programA.toString(), programB.toString());
         if (includeIdAndProtectedFields) {
             // Skip row ID since the one from system DB has the valid ID while the other does not.
             assertEquals(programA.getId(), programB.getId());
diff --git a/tv-provider/tests/src/android/support/media/tv/ProgramTest.java b/tv-provider/tests/src/android/support/media/tv/ProgramTest.java
index 927b34f..e809253 100644
--- a/tv-provider/tests/src/android/support/media/tv/ProgramTest.java
+++ b/tv-provider/tests/src/android/support/media/tv/ProgramTest.java
@@ -28,7 +28,6 @@
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SdkSuppress;
 import android.support.test.filters.SmallTest;
-import android.support.v4.os.BuildCompat;
 
 import junit.framework.TestCase;
 
@@ -113,14 +112,71 @@
         Uri programUri = resolver.insert(Programs.CONTENT_URI,
                 fullyPopulatedProgram.toContentValues());
 
-        Program programFromSystemDb;
+        Program programFromSystemDb = loadProgramFromContentProvider(resolver, programUri);
+        compareProgram(fullyPopulatedProgram, programFromSystemDb, false);
+    }
+
+    @Test
+    public void testProgramUpdateWithContentProvider() {
+        if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) {
+            return;
+        }
+        Channel channel = new Channel.Builder()
+                .setInputId("TestInputService")
+                .setType(TvContractCompat.Channels.TYPE_OTHER)
+                .build();
+        ContentResolver resolver = InstrumentationRegistry.getContext().getContentResolver();
+        Uri channelUri = resolver.insert(Channels.CONTENT_URI, channel.toContentValues());
+        assertNotNull(channelUri);
+
+        Program fullyPopulatedProgram =
+                createFullyPopulatedProgram(ContentUris.parseId(channelUri));
+        Uri programUri = resolver.insert(Programs.CONTENT_URI,
+                fullyPopulatedProgram.toContentValues());
+
+        Program programFromSystemDb = loadProgramFromContentProvider(resolver, programUri);
+        compareProgram(fullyPopulatedProgram, programFromSystemDb, false);
+
+        // Update a field from a fully loaded program.
+        Program updatedProgram = new Program.Builder(programFromSystemDb)
+                .setDescription("description1").build();
+        assertEquals(1, resolver.update(
+                programUri, updatedProgram.toContentValues(), null, null));
+        programFromSystemDb = loadProgramFromContentProvider(resolver, programUri);
+        compareProgram(updatedProgram, programFromSystemDb, false);
+
+        // Update a field with null from a fully loaded program.
+        updatedProgram = new Program.Builder(updatedProgram)
+                .setLongDescription(null).build();
+        assertEquals(1, resolver.update(
+                programUri, updatedProgram.toContentValues(), null, null));
+        programFromSystemDb = loadProgramFromContentProvider(resolver, programUri);
+        compareProgram(updatedProgram, programFromSystemDb, false);
+
+        // Update a field without referencing fully loaded program.
+        ContentValues values = new Program.Builder().setDescription("description2").build()
+                .toContentValues();
+        assertEquals(1, values.size());
+        assertEquals(1, resolver.update(programUri, values, null, null));
+        programFromSystemDb = loadProgramFromContentProvider(resolver, programUri);
+        Program expectedProgram = new Program.Builder(programFromSystemDb)
+                .setDescription("description2").build();
+        compareProgram(expectedProgram, programFromSystemDb, false);
+    }
+
+    @Test
+    public void testProgramEquals() {
+        assertEquals(createFullyPopulatedProgram(1), createFullyPopulatedProgram(1));
+    }
+
+    private static Program loadProgramFromContentProvider(
+            ContentResolver resolver, Uri programUri) {
         try (Cursor cursor = resolver.query(programUri, null, null, null, null)) {
             assertNotNull(cursor);
             assertEquals(1, cursor.getCount());
             cursor.moveToNext();
-            programFromSystemDb = Program.fromCursor(cursor);
+            return Program.fromCursor(cursor);
         }
-        compareProgram(fullyPopulatedProgram, programFromSystemDb, false);
     }
 
     private static Program createFullyPopulatedProgram(long channelId) {
@@ -186,17 +242,15 @@
             assertTrue(Objects.equals(programA.isRecordingProhibited(),
                     programB.isRecordingProhibited()));
         }
-        if (BuildCompat.isAtLeastO()) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             assertEquals(programA.getReviewRatingStyle(), programB.getReviewRatingStyle());
             assertEquals(programA.getReviewRating(), programB.getReviewRating());
         }
-        assertEquals(programA.toString(), programB.toString());
         if (includeIdAndProtectedFields) {
             // Skip row ID since the one from system DB has the valid ID while the other does not.
             assertEquals(programA.getId(), programB.getId());
             assertEquals(programA.getPackageName(), programB.getPackageName());
             assertEquals(programA.toContentValues(), programB.toContentValues());
-            assertEquals(programA, programB);
         }
     }
 
diff --git a/tv-provider/tests/src/android/support/media/tv/WatchNextProgramTest.java b/tv-provider/tests/src/android/support/media/tv/WatchNextProgramTest.java
index 79048aa..b1a1041 100644
--- a/tv-provider/tests/src/android/support/media/tv/WatchNextProgramTest.java
+++ b/tv-provider/tests/src/android/support/media/tv/WatchNextProgramTest.java
@@ -16,6 +16,7 @@
 
 package android.support.media.tv;
 
+import android.annotation.TargetApi;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Intent;
@@ -25,8 +26,8 @@
 import android.net.Uri;
 import android.support.media.tv.TvContractCompat.WatchNextPrograms;
 import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SdkSuppress;
 import android.support.test.filters.SmallTest;
-import android.support.v4.os.BuildCompat;
 
 import junit.framework.TestCase;
 
@@ -41,14 +42,12 @@
  * values from them.
  */
 @SmallTest
+@SdkSuppress(minSdkVersion = 26)
+@TargetApi(26)
 public class WatchNextProgramTest extends TestCase {
 
     @Override
     protected void tearDown() {
-        // TODO: Use @SdkSuppress once Build.VERSION_CODES.O has a right value.
-        if (!BuildCompat.isAtLeastO()) {
-            return;
-        }
         if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) {
             return;
         }
@@ -58,9 +57,6 @@
 
     @Test
     public void testEmptyPreviewProgram() {
-        if (!BuildCompat.isAtLeastO()) {
-            return;
-        }
         WatchNextProgram emptyProgram = new WatchNextProgram.Builder().build();
         ContentValues contentValues = emptyProgram.toContentValues(true);
         compareProgram(emptyProgram,
@@ -70,9 +66,6 @@
 
     @Test
     public void testSampleProgram() {
-        if (!BuildCompat.isAtLeastO()) {
-            return;
-        }
         WatchNextProgram sampleProgram = new WatchNextProgram.Builder()
                 .setTitle("Program Title")
                 .setDescription("This is a sample program")
@@ -91,9 +84,6 @@
 
     @Test
     public void testFullyPopulatedProgram() {
-        if (!BuildCompat.isAtLeastO()) {
-            return;
-        }
         WatchNextProgram fullyPopulatedProgram = createFullyPopulatedWatchNextProgram();
         ContentValues contentValues = fullyPopulatedProgram.toContentValues(true);
         compareProgram(fullyPopulatedProgram,
@@ -107,9 +97,6 @@
 
     @Test
     public void testChannelWithSystemContentProvider() {
-        if (!BuildCompat.isAtLeastO()) {
-            return;
-        }
         if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) {
             return;
         }
@@ -118,21 +105,74 @@
         Uri watchNextProgramUri = resolver.insert(WatchNextPrograms.CONTENT_URI,
                 fullyPopulatedProgram.toContentValues());
 
-        WatchNextProgram programFromSystemDb;
-        try (Cursor cursor = resolver.query(watchNextProgramUri, null, null, null, null)) {
-            assertNotNull(cursor);
-            assertEquals(1, cursor.getCount());
-            cursor.moveToNext();
-            programFromSystemDb = WatchNextProgram.fromCursor(cursor);
-        }
+        WatchNextProgram programFromSystemDb =
+                loadWatchNextProgramFromContentProvider(resolver, watchNextProgramUri);
         compareProgram(fullyPopulatedProgram, programFromSystemDb, false);
     }
 
     @Test
-    public void testWatchNextProgramWithPartialData() {
-        if (!BuildCompat.isAtLeastO()) {
+    public void testWatchNextProgramUpdateWithContentProvider() {
+        if (!Utils.hasTvInputFramework(InstrumentationRegistry.getContext())) {
             return;
         }
+
+        WatchNextProgram fullyPopulatedProgram = createFullyPopulatedWatchNextProgram();
+        ContentResolver resolver = InstrumentationRegistry.getContext().getContentResolver();
+        Uri watchNextProgramUri = resolver.insert(WatchNextPrograms.CONTENT_URI,
+                fullyPopulatedProgram.toContentValues());
+
+        WatchNextProgram programFromSystemDb =
+                loadWatchNextProgramFromContentProvider(resolver, watchNextProgramUri);
+        compareProgram(fullyPopulatedProgram, programFromSystemDb, false);
+
+        // Update a field from a fully loaded watch-next program.
+        WatchNextProgram updatedProgram = new WatchNextProgram.Builder(programFromSystemDb)
+                .setInteractionCount(programFromSystemDb.getInteractionCount() + 1).build();
+        assertEquals(1, resolver.update(
+                watchNextProgramUri, updatedProgram.toContentValues(), null, null));
+        programFromSystemDb =
+                loadWatchNextProgramFromContentProvider(resolver, watchNextProgramUri);
+        compareProgram(updatedProgram, programFromSystemDb, false);
+
+        // Update a field with null from a fully loaded watch-next program.
+        updatedProgram = new WatchNextProgram.Builder(updatedProgram)
+                .setPreviewVideoUri(null).build();
+        assertEquals(1, resolver.update(
+                watchNextProgramUri, updatedProgram.toContentValues(), null, null));
+        programFromSystemDb = loadWatchNextProgramFromContentProvider(
+                resolver, watchNextProgramUri);
+        compareProgram(updatedProgram, programFromSystemDb, false);
+
+        // Update a field without referencing fully watch-next program.
+        ContentValues values = new PreviewProgram.Builder().setInteractionCount(1).build()
+                .toContentValues();
+        assertEquals(1, values.size());
+        assertEquals(1, resolver.update(watchNextProgramUri, values, null, null));
+        programFromSystemDb = loadWatchNextProgramFromContentProvider(
+                resolver, watchNextProgramUri);
+        WatchNextProgram expectedProgram = new WatchNextProgram.Builder(programFromSystemDb)
+                .setInteractionCount(1).build();
+        compareProgram(expectedProgram, programFromSystemDb, false);
+    }
+
+    @Test
+    public void testWatchNextProgramEquals() {
+        assertEquals(createFullyPopulatedWatchNextProgram(),
+                createFullyPopulatedWatchNextProgram());
+    }
+
+    private static WatchNextProgram loadWatchNextProgramFromContentProvider(
+            ContentResolver resolver, Uri watchNextProgramUri) {
+        try (Cursor cursor = resolver.query(watchNextProgramUri, null, null, null, null)) {
+            assertNotNull(cursor);
+            assertEquals(1, cursor.getCount());
+            cursor.moveToNext();
+            return WatchNextProgram.fromCursor(cursor);
+        }
+    }
+
+    @Test
+    public void testWatchNextProgramWithPartialData() {
         WatchNextProgram previewProgram = new WatchNextProgram.Builder()
                 .setInternalProviderId("ID-4321")
                 .setPreviewVideoUri(Uri.parse("http://example.com/preview-video.mpg"))
@@ -296,7 +336,6 @@
         assertEquals(programA.getReviewRatingStyle(), programB.getReviewRatingStyle());
         assertEquals(programA.getReviewRating(), programB.getReviewRating());
         assertEquals(programA.getContentId(), programB.getContentId());
-        assertEquals(programA.toString(), programB.toString());
         if (includeIdAndProtectedFields) {
             // Skip row ID since the one from system DB has the valid ID while the other does not.
             assertEquals(programA.getId(), programB.getId());
