使用SQLOpenHelper在Android的SQLite中存储BLOB

3

有没有一种方法可以使用 SQLOpenHelper 将 BLOB 存储到 Android 的 SQLite 中?

我的 BLOB 类型为 InputStream

1个回答

3

SQLite不支持流式传输BLOB或CLOB数据。你有四个选项:

  • 将InputStream转换为byte[]。只有在内存足够的情况下才能使用此方法(见下文)。
  • 使用FileOutputStream或支持流式传输的Android API
  • 将数据分成小块并将其存储在SQLite中
  • 使用适用于Android且支持流式传输的数据库。我只知道H2数据库。但请注意,H2的Android支持非常新。在这种情况下,您需要使用JDBC API,并且可能需要启用数据库中的LOBs,否则每个大型BLOB都将存储在单独的文件中。

要将InputStream转换为字节数组,可以使用以下代码:

public static byte[] readBytesAndClose(InputStream in) throws IOException {
    try {
        int block = 4 * 1024;
        ByteArrayOutputStream out = new ByteArrayOutputStream(block);
        byte[] buff = new byte[block];
        while (true) {
            int len = in.read(buff, 0, block);
            if (len < 0) {
                break;
            }
            out.write(buff, 0, len);
        }
        return out.toByteArray();
    } finally {
        in.close();
    }
}

我能将它转换为byte[],然后将其存储在BLOB中吗? - mlevit
当然可以将InputStream转换为byte[],但前提是字节数组实际上适合内存。让我添加代码。 - Thomas Mueller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接