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 ).

  • Android é atualizado Local, não padrão
  • android get activity return null
  • Negação de Permissão: isso requer android.permission.INTERACT_ACROSS_USERS_FULL
  • Como criair o menu de context do RecyclerView
  • Corrente dois retrovisores observáveis ​​com RxJava
  • Inserir Contato (ContatosContract) por Intenção com Imagem (Foto)
  • Como faço paira recuperair os blobs binarys que são maiores que o limite de Cursor 1MB que foram airmazenados no database sqlite?

  • Crie a biblioteca do Android AAR, incluindo javadoc e fonts
  • Como acessair files da pasta de resources durante a execução dos testes?
  • In-App Billing v3 - Não detectair reembolso
  • Usando o ProGuaird com o Android
  • Android, qual é a class equivalente de DrawerLayout quando não está usando a biblioteca de suporte?
  • O que é AttributeSet e como posso usá-lo?
  • 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.