am 04d70252: am 36f06f4c: Merge "DB migration to eliminate some null fields in old...
Steve Howard [Thu, 23 Sep 2010 20:10:54 +0000 (13:10 -0700)]
Merge commit '04d7025262d7f6c5c372ec699d78b18d05b0400b'

* commit '04d7025262d7f6c5c372ec699d78b18d05b0400b':
  DB migration to eliminate some null fields in old downloads

src/com/android/providers/downloads/DownloadProvider.java

index 0e451d0..44d755d 100644 (file)
@@ -57,7 +57,7 @@ public final class DownloadProvider extends ContentProvider {
     /** Database filename */
     private static final String DB_NAME = "downloads.db";
     /** Current database version */
-    private static final int DB_VERSION = 104;
+    private static final int DB_VERSION = 105;
     /** Name of table in the database */
     private static final String DB_TABLE = "downloads";
 
@@ -228,12 +228,38 @@ public final class DownloadProvider extends ContentProvider {
                             "INTEGER NOT NULL DEFAULT 0");
                     break;
 
+                case 105:
+                    fillNullValues(db);
+                    break;
+
                 default:
                     throw new IllegalStateException("Don't know how to upgrade to " + version);
             }
         }
 
         /**
+         * insert() now ensures these four columns are never null for new downloads, so this method
+         * makes that true for existing columns, so that code can rely on this assumption.
+         */
+        private void fillNullValues(SQLiteDatabase db) {
+            ContentValues values = new ContentValues();
+            values.put(Downloads.Impl.COLUMN_CURRENT_BYTES, 0);
+            fillNullValuesForColumn(db, values);
+            values.put(Downloads.Impl.COLUMN_TOTAL_BYTES, -1);
+            fillNullValuesForColumn(db, values);
+            values.put(Downloads.Impl.COLUMN_TITLE, "");
+            fillNullValuesForColumn(db, values);
+            values.put(Downloads.Impl.COLUMN_DESCRIPTION, "");
+            fillNullValuesForColumn(db, values);
+        }
+
+        private void fillNullValuesForColumn(SQLiteDatabase db, ContentValues values) {
+            String column = values.valueSet().iterator().next().getKey();
+            db.update(DB_TABLE, values, column + " is null", null);
+            values.clear();
+        }
+
+        /**
          * Set all existing downloads to the cache partition to be invisible in the downloads UI.
          */
         private void makeCacheDownloadsInvisible(SQLiteDatabase db) {
@@ -463,6 +489,7 @@ public final class DownloadProvider extends ContentProvider {
         copyStringWithDefault(Downloads.Impl.COLUMN_TITLE, values, filteredValues, "");
         copyStringWithDefault(Downloads.Impl.COLUMN_DESCRIPTION, values, filteredValues, "");
         filteredValues.put(Downloads.Impl.COLUMN_TOTAL_BYTES, -1);
+        filteredValues.put(Downloads.Impl.COLUMN_CURRENT_BYTES, 0);
 
         if (values.containsKey(Downloads.Impl.COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI)) {
             copyBoolean(Downloads.Impl.COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI, values, filteredValues);