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 只是为了方便。如果他们为你工作,那很好。如果它们不适合您,那么您将不得不推出自己的实用程序方法。