【问题标题】:DatabaseUtils cursorRowToContentValues converts blob to stringDatabaseUtils cursorRowToContentValues 将 blob 转换为字符串
【发布时间】:2015-07-02 22:19:25
【问题描述】:

我刚刚偶然发现 Android 的 DatabaseUtils.cursorRowToContentValues 方法存在问题。 在游标中,blob 正确存储为字节数组。 cursor.getBlob() 也返回正确的值。 但是使用 utils 方法转换后,ContentValues 包含一个字符串,调用 getAsByteArray 返回 null,因为没有带有该键的字节数组。

我找不到任何错误报告,但我认为这不是故意的?

【问题讨论】:

  • 你有一些代码来演示这个问题吗?该方法支持 blob,只要数据实际上是 blob 并且光标是 AbstractWindowedCursor
  • 光标是一个自填充的MatrixCursor。我会在星期一尝试为它写一个测试。
  • 好的,这就解释了。我会在答案中扩展它。
  • 是的,我刚刚查看了 DatabaseUtils 源。我想知道他们为什么这样做。至少应该写在doc里!
  • 同意Android sqlite 文档不是很擅长的地方。使用源代码,不要只相信文档。

标签: android cursor blob android-cursor


【解决方案1】:

光标是一个自填充的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 只是为了方便。如果他们为你工作,那很好。如果它们不适合您,那么您将不得不推出自己的 util 方法。

【讨论】:

    猜你喜欢
    • 2013-06-28
    • 2020-01-19
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 2015-10-27
    • 2012-03-28
    • 1970-01-01
    相关资源
    最近更新 更多