From 794cf190aa38dffdad9e82fc86dbd94940b175b1 Mon Sep 17 00:00:00 2001 From: Michael Wright Date: Wed, 18 Jan 2017 18:12:53 +0000 Subject: [PATCH] Also parse "1" as true for ContentValues#getAsBoolean SQLite's internal representation for booleans is an integer with a value of 0 or 1, so without this check, boolean values obtained via DatabaseUtils#cursorRowToContentValues will always return false. Bug: 34365384 Test: demo app, cts Change-Id: I6c0829c992252ca5ee16bd5eac48668507fd4089 --- core/java/android/content/ContentValues.java | 6 +++++- core/java/android/database/DatabaseUtils.java | 5 +---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/core/java/android/content/ContentValues.java b/core/java/android/content/ContentValues.java index 7ed827c00e652..3a87cb3e7a293 100644 --- a/core/java/android/content/ContentValues.java +++ b/core/java/android/content/ContentValues.java @@ -414,7 +414,11 @@ public final class ContentValues implements Parcelable { return (Boolean) value; } catch (ClassCastException e) { if (value instanceof CharSequence) { - return Boolean.valueOf(value.toString()); + // Note that we also check against 1 here because SQLite's internal representation + // for booleans is an integer with a value of 0 or 1. Without this check, boolean + // values obtained via DatabaseUtils#cursorRowToContentValues will always return + // false. + return Boolean.valueOf(value.toString()) || "1".equals(value); } else if (value instanceof Number) { return ((Number) value).intValue() != 0; } else { diff --git a/core/java/android/database/DatabaseUtils.java b/core/java/android/database/DatabaseUtils.java index 227066ddc571c..8cd3d7b5bc688 100644 --- a/core/java/android/database/DatabaseUtils.java +++ b/core/java/android/database/DatabaseUtils.java @@ -728,13 +728,10 @@ public class DatabaseUtils { * @param values the {@link ContentValues} to put the row into. */ public static void cursorRowToContentValues(Cursor cursor, ContentValues values) { - AbstractWindowedCursor awc = - (cursor instanceof AbstractWindowedCursor) ? (AbstractWindowedCursor) cursor : null; - String[] columns = cursor.getColumnNames(); int length = columns.length; for (int i = 0; i < length; i++) { - if (awc != null && awc.isBlob(i)) { + if (cursor.getType(i) == Cursor.FIELD_TYPE_BLOB) { values.put(columns[i], cursor.getBlob(i)); } else { values.put(columns[i], cursor.getString(i));