Salvar imagem no formato blob Sqlite

1,987 views
Skip to first unread message

Willian do Amor

unread,
Jul 31, 2014, 10:23:16 AM7/31/14
to androidb...@googlegroups.com
Bom dia a todos,

estou desenvolvendo uma aplicação onde possuo um WS com Datasnap para fazer a sincronização dos dados como Android.


Esse WS se conecta a um banco de dados firebird.
Minha grande dificuldade no momento é que no firebird tem os campos de imagem e de observação no formato BLOB, no SQlite escolhi o formato Blob porém sem sucesso, recebo a mensagem de que os campos não são compatíveis.

Alguém sabe como proceder nesse caso?

Pedro Subutzki <Pepeu>

unread,
Jul 31, 2014, 11:14:45 AM7/31/14
to androidb...@googlegroups.com
A dica que eu dou é, NÃO SALVE A IMAGEM NO BANCO DO ANDROID! :)
Isso já é um ruim de se fazer num banco de dados com grandes recursos de processador e memoria. Fazer isso no android é praticamente dar um tiro na cabeça!

Aconselho você analisar sua aplicação e requisitos e seguir por outro caminho.

Abraços,
Pedro Subutzki



--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Thiago Lopes Da Silva

unread,
Jul 31, 2014, 11:20:34 AM7/31/14
to androidb...@googlegroups.com
Concordo com pedro. Pense em salvar talvez a referência do recurso. Uma dica é você usar uma ferramenta nativa do android para fazer o sync dos dados. Segue o link do post oficial. http://developer.android.com/training/sync-adapters/index.html

Enviada do meu iPhone

Pedro Subutzki <Pepeu>

unread,
Jul 31, 2014, 11:42:00 AM7/31/14
to androidb...@googlegroups.com
Só pra ficar mais claro, vai existir um problema enorme de escalabilidade se salvar as imagens no banco.
Isso impacta na consulta do lado do servidor, impacta na integração (não ai poder fazer cache da imagem por exemplo) e vai impactar negativamente no app.


Abraços,
Pedro Subutzki

Geovani de Souza

unread,
Jul 31, 2014, 12:02:59 PM7/31/14
to androidb...@googlegroups.com
+1 @PedroSubutzki

Procure aqui na lista e na documentação oficial sobre os diretórios de armazenamento interno, externo e SD. Então, salve a imagem com um nome aleatório (uma hash, por exemplo) e salve esse nome no db.

Marcelo Alves

unread,
Jul 31, 2014, 12:16:50 PM7/31/14
to androidb...@googlegroups.com

​O problema que eu vejo (alguém me corrija se eu estiver errado pra não falar besteira novamente) é que se você salvar as imagens no banco, é bem provável que mesmo que por um curto momento você terá entre duas a cinco vezes o tamanho da imagem na memória (como blob, como bytes, alguns formatos intermediários até virar drawable, e o caminho inverso). Em dispositivos com pouca memória, isso é um bom motivo pra OutOfMemoryError, dependendo do tamanho da imagem.

:: marcelo.alves

Willian do Amor

unread,
Jul 31, 2014, 1:42:25 PM7/31/14
to androidb...@googlegroups.com
Na verdade o que eu quero mesmo é um jeito de pegar o data typo Blob do Firebird de salvar no data type do SQlite.

Assim como os campos OBS são textos la no Firebird e no SQlite eu não os estou conseguindo sincronizar.


Em 31 de julho de 2014 13:16, Marcelo Alves <marcel...@me.com> escreveu:

​O problema que eu vejo (alguém me corrija se eu estiver errado pra não falar besteira novamente) é que se você salvar as imagens no banco, é bem provável que mesmo que por um curto momento você terá entre duas a cinco vezes o tamanho da imagem na memória (como blob, como bytes, alguns formatos intermediários até virar drawable, e o caminho inverso). Em dispositivos com pouca memória, isso é um bom motivo pra OutOfMemoryError, dependendo do tamanho da imagem.

:: marcelo.alves

--

Maicon Strey

unread,
Jul 31, 2014, 1:45:25 PM7/31/14
to androidb...@googlegroups.com

Mas se esse blob são imagens não adianta muito tu conseguir fazer isso porque no fim teu app vai ficar bugado!

Ou vai ficar lento ou vai dar erros de OutOfMemory.

O melhor é tu pegar o blob do firebird, transformar em imagem e salvar no SDCard. Daí no SQLite tu salva o nome ou caminho de onde tu salvou a imagem.

Willian do Amor

unread,
Jul 31, 2014, 2:14:53 PM7/31/14
to androidb...@googlegroups.com
Então na verdade o que me interessa mais são os campos Blob do tipo OBSERVAÇÂO no firebird pois no pedido pode ter alguma informação que o vendedor deseje informar para o faturista ou entregar.

Então no Firebird os Campos de Observação são do tipo BLOB TEXTO e no SQLITE não achei correspondente pois no SQLite tem o tipo BLOB porém o mesmo não esta sendo compativel com o BLOB 

Maicon Strey

unread,
Jul 31, 2014, 2:18:57 PM7/31/14
to androidb...@googlegroups.com

Tentou usar o tipo TEXT no SQLite?

Willian do Amor

unread,
Jul 31, 2014, 2:22:08 PM7/31/14
to androidb...@googlegroups.com
Nao mas vou tentar esse..

Willian do Amor

unread,
Aug 1, 2014, 10:53:57 AM8/1/14
to androidb...@googlegroups.com
Aproveitando alguém sabe se tem alguma forma de alterar o data type do campo via sql no android?

Vitor

unread,
Aug 4, 2014, 9:57:33 PM8/4/14
to androidb...@googlegroups.com
Tente isso, espero que ajude:

                        URL url = new URL("endereço da imagem");
                        
                        InputStream in = url.openConnection().getInputStream();

                        byte[] buffer = readBytes(in);

                        ContentValues values = new ContentValues();

                        values.put("campo_da_imagem", buffer);
                        
                        mDataHelper.getWritableDatabase().update("tabela", values, "id=?", new String[]{"id_procurado"});

Vitor

unread,
Aug 5, 2014, 2:55:21 AM8/5/14
to androidb...@googlegroups.com
Esqueci de postar o método para ler o bytes

    //Converte o inputStream para byte[]
    public byte[] readBytes(InputStream inputStream) throws IOException {

          ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();

          int bufferSize = 1024;
          byte[] buffer = new byte[bufferSize];

          int len = 0;
          while ((len = inputStream.read(buffer)) != -1) {
            byteBuffer.write(buffer, 0, len);
          }

          return byteBuffer.toByteArray();
    }

Willian do Amor

unread,
Aug 6, 2014, 9:08:07 AM8/6/14
to androidb...@googlegroups.com
Ok obrigado vou tentar



--
Reply all
Reply to author
Forward
0 new messages