DatabaseUtils cursorRowToContentValues 将 blob 转换为字符串
DatabaseUtils cursorRowToContentValues converts blob to string
我刚刚偶然发现 Android 的 DatabaseUtils.cursorRowToContentValues
方法有问题。
在游标中,blob 正确存储为字节数组。 cursor.getBlob()
也是 returns 正确的值。
但是用utils方法转换后,ContentValues
里面是一个字符串,调用getAsByteArray
returns null,因为没有那个key的byte数组。
我找不到任何关于此的错误报告,但我认为这不是故意的?
The cursor is a self filled MatrixCursor.
这就是问题所在。
这是 DatabaseUtils.cursorRowToContentValues()
的代码:
710 public static void cursorRowToContentValues(Cursor cursor, ContentValues values) {
711 AbstractWindowedCursor awc =
712 (cursor instanceof AbstractWindowedCursor) ? (AbstractWindowedCursor) cursor : null;
713
714 String[] columns = cursor.getColumnNames();
715 int length = columns.length;
716 for (int i = 0; i < length; i++) {
717 if (awc != null && awc.isBlob(i)) {
718 values.put(columns[i], cursor.getBlob(i));
719 } else {
720 values.put(columns[i], cursor.getString(i));
721 }
722 }
723 }
注意 AbstractWindowedCursor
的用法。如果光标不是一个,则所有内容都被视为字符串,包括 blob。
现在,MatrixCursor
的继承图是:
java.lang.Object
↳ android.database.AbstractCursor
↳ android.database.MatrixCursor
没有AbstractWindowedCursor
那里。
总的来说,DatabaseUtils
只是为了方便。如果他们为你工作,那很好。如果它们不适合您,那么您将不得不推出自己的实用程序方法。
我刚刚偶然发现 Android 的 DatabaseUtils.cursorRowToContentValues
方法有问题。
在游标中,blob 正确存储为字节数组。 cursor.getBlob()
也是 returns 正确的值。
但是用utils方法转换后,ContentValues
里面是一个字符串,调用getAsByteArray
returns null,因为没有那个key的byte数组。
我找不到任何关于此的错误报告,但我认为这不是故意的?
The cursor is a self filled MatrixCursor.
这就是问题所在。
这是 DatabaseUtils.cursorRowToContentValues()
的代码:
710 public static void cursorRowToContentValues(Cursor cursor, ContentValues values) {
711 AbstractWindowedCursor awc =
712 (cursor instanceof AbstractWindowedCursor) ? (AbstractWindowedCursor) cursor : null;
713
714 String[] columns = cursor.getColumnNames();
715 int length = columns.length;
716 for (int i = 0; i < length; i++) {
717 if (awc != null && awc.isBlob(i)) {
718 values.put(columns[i], cursor.getBlob(i));
719 } else {
720 values.put(columns[i], cursor.getString(i));
721 }
722 }
723 }
注意 AbstractWindowedCursor
的用法。如果光标不是一个,则所有内容都被视为字符串,包括 blob。
现在,MatrixCursor
的继承图是:
java.lang.Object
↳ android.database.AbstractCursor
↳ android.database.MatrixCursor
没有AbstractWindowedCursor
那里。
总的来说,DatabaseUtils
只是为了方便。如果他们为你工作,那很好。如果它们不适合您,那么您将不得不推出自己的实用程序方法。