summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2020-05-19 17:22:25 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2020-05-19 17:22:25 +0000
commitf6f2273cb03f5cf3ebaa0eca75354cb8a433b050 (patch)
tree50e5d2602cf7e5c7b2dbc31c951317b67ebfdbf5 /core/java/android
parent470910085bf81db1edf260c2a884b11dfb54fba2 (diff)
parent0fd3e397601d5d4deb32fb132e6307410c8626f0 (diff)
Merge "Carry over bugfixes from MediaProvider." into rvc-dev
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/database/DatabaseUtils.java52
-rw-r--r--core/java/android/database/sqlite/SQLiteQueryBuilder.java6
2 files changed, 55 insertions, 3 deletions
diff --git a/core/java/android/database/DatabaseUtils.java b/core/java/android/database/DatabaseUtils.java
index 9b809b86eae9..b978ae559390 100644
--- a/core/java/android/database/DatabaseUtils.java
+++ b/core/java/android/database/DatabaseUtils.java
@@ -191,6 +191,58 @@ public class DatabaseUtils {
}
}
+ /** {@hide} */
+ public static long executeInsert(@NonNull SQLiteDatabase db, @NonNull String sql,
+ @Nullable Object[] bindArgs) throws SQLException {
+ try (SQLiteStatement st = db.compileStatement(sql)) {
+ bindArgs(st, bindArgs);
+ return st.executeInsert();
+ }
+ }
+
+ /** {@hide} */
+ public static int executeUpdateDelete(@NonNull SQLiteDatabase db, @NonNull String sql,
+ @Nullable Object[] bindArgs) throws SQLException {
+ try (SQLiteStatement st = db.compileStatement(sql)) {
+ bindArgs(st, bindArgs);
+ return st.executeUpdateDelete();
+ }
+ }
+
+ /** {@hide} */
+ private static void bindArgs(@NonNull SQLiteStatement st, @Nullable Object[] bindArgs) {
+ if (bindArgs == null) return;
+
+ for (int i = 0; i < bindArgs.length; i++) {
+ final Object bindArg = bindArgs[i];
+ switch (getTypeOfObject(bindArg)) {
+ case Cursor.FIELD_TYPE_NULL:
+ st.bindNull(i + 1);
+ break;
+ case Cursor.FIELD_TYPE_INTEGER:
+ st.bindLong(i + 1, ((Number) bindArg).longValue());
+ break;
+ case Cursor.FIELD_TYPE_FLOAT:
+ st.bindDouble(i + 1, ((Number) bindArg).doubleValue());
+ break;
+ case Cursor.FIELD_TYPE_BLOB:
+ st.bindBlob(i + 1, (byte[]) bindArg);
+ break;
+ case Cursor.FIELD_TYPE_STRING:
+ default:
+ if (bindArg instanceof Boolean) {
+ // Provide compatibility with legacy
+ // applications which may pass Boolean values in
+ // bind args.
+ st.bindLong(i + 1, ((Boolean) bindArg).booleanValue() ? 1 : 0);
+ } else {
+ st.bindString(i + 1, bindArg.toString());
+ }
+ break;
+ }
+ }
+ }
+
/**
* Binds the given Object to the given SQLiteProgram using the proper
* typing. For example, bind numbers as longs/doubles, and everything else
diff --git a/core/java/android/database/sqlite/SQLiteQueryBuilder.java b/core/java/android/database/sqlite/SQLiteQueryBuilder.java
index 36ec67ee1471..669d0466fdf2 100644
--- a/core/java/android/database/sqlite/SQLiteQueryBuilder.java
+++ b/core/java/android/database/sqlite/SQLiteQueryBuilder.java
@@ -626,7 +626,7 @@ public class SQLiteQueryBuilder {
Log.d(TAG, sql);
}
}
- return db.executeSql(sql, sqlArgs);
+ return DatabaseUtils.executeInsert(db, sql, sqlArgs);
}
/**
@@ -702,7 +702,7 @@ public class SQLiteQueryBuilder {
Log.d(TAG, sql);
}
}
- return db.executeSql(sql, sqlArgs);
+ return DatabaseUtils.executeUpdateDelete(db, sql, sqlArgs);
}
/**
@@ -762,7 +762,7 @@ public class SQLiteQueryBuilder {
Log.d(TAG, sql);
}
}
- return db.executeSql(sql, sqlArgs);
+ return DatabaseUtils.executeUpdateDelete(db, sql, sqlArgs);
}
private void enforceStrictColumns(@Nullable String[] projection) {