summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jeff Sharkey <jsharkey@android.com> 2018-07-26 09:39:18 -0600
committer Jeff Sharkey <jsharkey@android.com> 2018-12-03 09:41:16 -0700
commit0f73219cfadcbe9916b05603f238120f8b56f600 (patch)
treea4a1449faa6fb896d741cc35449b01ae96c7b5d7
parent234de02b594a6f98c7ba92760533d3c6a2592c01 (diff)
Bind update() args as Object[] for performance.
It's wasteful to convert them to String when SQLite already knows how to bind specific data types, including funky types like byte[]. Also promote to public API, since they're generally useful. Bug: 111085900 Test: atest packages/providers/DownloadProvider/tests/ Test: atest cts/tests/app/src/android/app/cts/DownloadManagerTest.java Test: atest cts/tests/tests/database/src/android/database/sqlite/cts/SQLiteQueryBuilderTest.java Merged-In: I5b418bca1204773fd2795156a2f47906ca1e1a6b Change-Id: I386cbc97cf3499823bc10251ff315ce381db24cc
-rwxr-xr-xapi/current.txt2
-rw-r--r--core/java/android/database/sqlite/SQLiteQueryBuilder.java21
2 files changed, 14 insertions, 9 deletions
diff --git a/api/current.txt b/api/current.txt
index 7c33ec50fa4c..b9615e0c2af3 100755
--- a/api/current.txt
+++ b/api/current.txt
@@ -12676,6 +12676,7 @@ package android.database.sqlite {
method public java.lang.String buildUnionQuery(java.lang.String[], java.lang.String, java.lang.String);
method public java.lang.String buildUnionSubQuery(java.lang.String, java.lang.String[], java.util.Set<java.lang.String>, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
method public deprecated java.lang.String buildUnionSubQuery(java.lang.String, java.lang.String[], java.util.Set<java.lang.String>, int, java.lang.String, java.lang.String, java.lang.String[], java.lang.String, java.lang.String);
+ method public int delete(android.database.sqlite.SQLiteDatabase, java.lang.String, java.lang.String[]);
method public java.lang.String getTables();
method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String);
method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
@@ -12685,6 +12686,7 @@ package android.database.sqlite {
method public void setProjectionMap(java.util.Map<java.lang.String, java.lang.String>);
method public void setStrict(boolean);
method public void setTables(java.lang.String);
+ method public int update(android.database.sqlite.SQLiteDatabase, android.content.ContentValues, java.lang.String, java.lang.String[]);
}
public class SQLiteReadOnlyDatabaseException extends android.database.sqlite.SQLiteException {
diff --git a/core/java/android/database/sqlite/SQLiteQueryBuilder.java b/core/java/android/database/sqlite/SQLiteQueryBuilder.java
index 6f907112ba6f..4f24b958b954 100644
--- a/core/java/android/database/sqlite/SQLiteQueryBuilder.java
+++ b/core/java/android/database/sqlite/SQLiteQueryBuilder.java
@@ -30,7 +30,7 @@ import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Log;
-import com.android.internal.util.ArrayUtils;
+import libcore.util.EmptyArray;
import java.util.Arrays;
import java.util.Iterator;
@@ -461,7 +461,6 @@ public class SQLiteQueryBuilder
* that they appear in the selection. The values will be bound
* as Strings.
* @return the number of rows updated
- * @hide
*/
public int update(@NonNull SQLiteDatabase db, @NonNull ContentValues values,
@Nullable String selection, @Nullable String[] selectionArgs) {
@@ -496,14 +495,19 @@ public class SQLiteQueryBuilder
sql = unwrappedSql;
}
+ if (selectionArgs == null) {
+ selectionArgs = EmptyArray.STRING;
+ }
final ArrayMap<String, Object> rawValues = values.getValues();
- final String[] updateArgs = new String[rawValues.size()];
- for (int i = 0; i < updateArgs.length; i++) {
- final Object arg = rawValues.valueAt(i);
- updateArgs[i] = (arg != null) ? arg.toString() : null;
+ final int valuesLength = rawValues.size();
+ final Object[] sqlArgs = new Object[valuesLength + selectionArgs.length];
+ for (int i = 0; i < sqlArgs.length; i++) {
+ if (i < valuesLength) {
+ sqlArgs[i] = rawValues.valueAt(i);
+ } else {
+ sqlArgs[i] = selectionArgs[i - valuesLength];
+ }
}
-
- final String[] sqlArgs = ArrayUtils.concat(String.class, updateArgs, selectionArgs);
if (Log.isLoggable(TAG, Log.DEBUG)) {
if (Build.IS_DEBUGGABLE) {
Log.d(TAG, sql + " with args " + Arrays.toString(sqlArgs));
@@ -527,7 +531,6 @@ public class SQLiteQueryBuilder
* that they appear in the selection. The values will be bound
* as Strings.
* @return the number of rows deleted
- * @hide
*/
public int delete(@NonNull SQLiteDatabase db, @Nullable String selection,
@Nullable String[] selectionArgs) {