Хранить BLOB в SQLite для Android с помощью SQLOpenHelper - PullRequest
3 голосов
/ 04 сентября 2010

Есть ли способ сохранить BLOB-объект в SQLite для Android с помощью SQLOpenHelper?

Мой BLOB типа InputStream.

1 Ответ

3 голосов
/ 04 сентября 2010

SQLite не поддерживает потоковую передачу данных BLOB или CLOB.У вас есть четыре варианта:

  • Преобразовать InputStream в байт [].Это будет работать, только если у вас достаточно памяти (см. Ниже).
  • Используйте FileOutputStream или Android API, который поддерживает потоковую передачу
  • Разделите данные на небольшие блоки и сохраните их в SQLite
  • Используйте базу данных, которая работает на Android и поддерживает потоковую передачу.Я знаю только базу данных H2 .Но учтите, что поддержка Android для H2 очень нова.В этом случае вам нужно использовать API JDBC, и вы, вероятно, захотите включить больших объектов в базе данных , в противном случае каждый большой большой двоичный объект хранится в отдельном файле.

Комупреобразовать 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();
    }
}
...