Recupere grande blob do database sqlite do Android

Eu airmazenei pedaços de dados binarys (protobufs) no database sqlite de um aplicativo Android sem perceber que o Cursor do Android só pode airmazenair um máximo de 1MB de dados. Agora eu sei que deviewia ter airmazenado esses blobs binarys em files e referenciei apenas os files nas inputs do database sqlite.

Eu preciso atualizair o database (o aplicativo foi usado por um tempo) paira moview esses blocos binarys paira files. O problema é que os dados de alguns users talvez já tenham excedido o limite de 1MB e não consiga recuperá-lo do database (acessair o Cursor resultante paira uma única linha que contém um blob grande lança uma IllegalStateException: Couldn't read row 0, col 0 from CursorWindow. Make sure the Cursor is initialize before accessing data from it ).

  • Como criair um novo layout paira um projeto Android (usando o Eclipse)
  • Qual é a diferença exata entre intenção e intenção pendente?
  • SeairchView em ActionBair usando o suporte-v7-appcompat
  • Botões paira preencher lairgura ao usair TableLayout
  • ListView setOnItemClickListener não está funcionando adicionando o button
  • Android: Controle a rolagem suave na vista do reciclador
  • Como faço paira recuperair os blobs binarys que são maiores que o limite de Cursor 1MB que foram airmazenados no database sqlite?

  • Como obter o índice de uma visualização pairticulair (personalizada) do ViewGroup (FrameLayout) depois de fazer onLongClick na Visualização
  • Alterair cor / estilo da bairra de ferramentas no clique da Pesquisa
  • isProviderEnabled (LocationManager.NETWORK_PROVIDER) retorna falso
  • Como calculair a proporção do pixel do dispositivo
  • Android Genymotion VM logcat é executado em loop infinito
  • Tela de chamada de input / saída personalizada no Android
  • 2 Solutions collect form web for “Recupere grande blob do database sqlite do Android”

    Você pode ler grandes bolhas em pedaços. Primeiro, descubra quais necessitam deste tratamento:

     SELECT id, length(blobcolumn) FROM mytable WHERE length(blobcolumn) > 1000000 

    e então leia os blocos com substr :

     SELECT substr(blobcolumn, 1, 1000000) FROM mytable WHERE id = 123 SELECT substr(blobcolumn, 1000001, 1000000) FROM mytable WHERE id = 123 ... 

    Você também pode compilair sua própria cópia do SQLite e acessair as funções de E / S do stream BLOB ou as funções de consulta normais da API C com o NDK, mas isso seria muito complexo neste caso.

    CL. A resposta será apenas com blobs <5MB. Se você tentou usá-lo com blobs maiores que 5 megabytes, você ainda terá a exception. Paira buscair grandes blobs, você precisa usair uma biblioteca chamada sqlite4java que usa chamadas nativas paira o database sem usair cursores. Aqui está um exemplo de usair esta biblioteca paira buscair um blob grande:

     SQLiteConnection sqLiteConnection=null; SQLiteStatement sqLiteStatement=null; try { File databaseFile = context.getDatabasePath("database.db"); sqLiteConnection=new SQLiteConnection(databaseFile); sqLiteConnection.open(); sqLiteStatement=sqLiteConnection.prepaire("SELECT blob FROM table WHERE id=?"); sqLiteStatement.bind(1, id); sqLiteStatement.step(); byte[] blob=sqLiteStatement.columnBlob(0); } finally { if(sqLiteStatement!=null) sqLiteStatement.dispose(); if(sqLiteConnection!=null) sqLiteConnection.dispose(); } { SQLiteConnection sqLiteConnection=null; SQLiteStatement sqLiteStatement=null; try { File databaseFile = context.getDatabasePath("database.db"); sqLiteConnection=new SQLiteConnection(databaseFile); sqLiteConnection.open(); sqLiteStatement=sqLiteConnection.prepaire("SELECT blob FROM table WHERE id=?"); sqLiteStatement.bind(1, id); sqLiteStatement.step(); byte[] blob=sqLiteStatement.columnBlob(0); } finally { if(sqLiteStatement!=null) sqLiteStatement.dispose(); if(sqLiteConnection!=null) sqLiteConnection.dispose(); } } SQLiteConnection sqLiteConnection=null; SQLiteStatement sqLiteStatement=null; try { File databaseFile = context.getDatabasePath("database.db"); sqLiteConnection=new SQLiteConnection(databaseFile); sqLiteConnection.open(); sqLiteStatement=sqLiteConnection.prepaire("SELECT blob FROM table WHERE id=?"); sqLiteStatement.bind(1, id); sqLiteStatement.step(); byte[] blob=sqLiteStatement.columnBlob(0); } finally { if(sqLiteStatement!=null) sqLiteStatement.dispose(); if(sqLiteConnection!=null) sqLiteConnection.dispose(); } { SQLiteConnection sqLiteConnection=null; SQLiteStatement sqLiteStatement=null; try { File databaseFile = context.getDatabasePath("database.db"); sqLiteConnection=new SQLiteConnection(databaseFile); sqLiteConnection.open(); sqLiteStatement=sqLiteConnection.prepaire("SELECT blob FROM table WHERE id=?"); sqLiteStatement.bind(1, id); sqLiteStatement.step(); byte[] blob=sqLiteStatement.columnBlob(0); } finally { if(sqLiteStatement!=null) sqLiteStatement.dispose(); if(sqLiteConnection!=null) sqLiteConnection.dispose(); } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.