A documentação do Android SDK diz que o startManagingCursor()
método está obsoleto:
Este método está obsoleto. Em vez disso, use a nova classe CursorLoader com LoaderManager; isso também está disponível em plataformas mais antigas por meio do pacote de compatibilidade do Android. Este método permite que a atividade cuide do gerenciamento do ciclo de vida do Cursor fornecido para você com base no ciclo de vida da atividade. Ou seja, quando a atividade for interrompida, ela chamará automaticamente deactivate () no Cursor fornecido e, quando for reiniciada posteriormente, chamará a consulta de consulta () para você. Quando a atividade é destruída, todos os Cursores gerenciados serão fechados automaticamente. Se você está direcionando HONEYCOMB ou posterior, considere usar LoaderManager, disponível via getLoaderManager ()
Então, eu gostaria de usar CursorLoader
. Mas como posso usá-lo com custom CursorAdapter
e sem ContentProvider
, quando preciso de URI no construtor de CursorLoader
?
Respostas:
Escrevi um CursorLoader simples que não precisa de um provedor de conteúdo:
Só precisa da
AsyncTaskLoader
aula. Tanto o do Android 3.0 ou superior, quanto o que vem com o pacote de compatibilidade.Também escrevi um
ListLoader
que é compatível com oLoadManager
e é usado para recuperar umajava.util.List
coleção genérica .fonte
Escreva seu próprio carregador que usa sua classe de banco de dados em vez de um provedor de conteúdo. A maneira mais fácil é simplesmente pegar a fonte da
CursorLoader
classe da biblioteca de compatibilidade e substituir as consultas do provedor por consultas à sua própria classe auxiliar de banco de dados.fonte
CursorLoader
descendente para gerenciar um cursor SQLite, aparte do construtor. Só precisei substituir oloadInBackground
método para substituir a consulta do provedor pela consulta do meu cursorO SimpleCursorLoader é uma solução simples, porém não suporta a atualização do carregador quando os dados mudam. CommonsWare tem uma biblioteca loaderex que adiciona um SQLiteCursorLoader e oferece suporte a novas consultas sobre alterações de dados.
https://github.com/commonsguy/cwac-loaderex
fonte
Uma terceira opção seria simplesmente substituir
loadInBackground
:Isso também cuidará de consultar novamente o cursor quando o banco de dados for alterado.
Apenas ressalva: você terá que definir outro observador, já que o Google em sua infinita sabedoria decidiu tornar seu pacote privado. Se você colocar a classe no mesmo pacote que o original (ou compat), você pode usar o observador original. O observador é um objeto muito leve e não é usado em nenhum outro lugar, então isso não faz muita diferença.
fonte
loadInBackground()
, antes de retornar o cursor, digamos quecursor.setNotificationUri(getContext().getContentResolver(), uri);
o uri pode apenas de String aleatória comoUri.parse("content://query_slot1")
. Parece que não importa se o uri realmente existe ou não. E uma vez que fiz a operação no DB. SaygetContentResolver().notifyChange(uri, null);
faria o truque. Então, posso criar alguns "slots de uri de consulta" em um arquivo contant para o aplicativo com um pequeno número de consultas. Eu testo inserir o registro do banco de dados em tempo de execução e parece funcionar, mas ainda duvido que seja uma boa prática nele. Alguma sugestão?A terceira opção proposta por Timo Ohr, juntamente com os comentários de Yeung, fornecem a resposta mais simples (a navalha de Occam). Abaixo está um exemplo de uma classe completa que funciona para mim. Existem duas regras para usar esta classe.
Sempre que o banco de dados subjacente mudar (por exemplo, após uma inserção ou exclusão), certifique-se de chamar
onde myUri é o mesmo retornado de sua implementação do método getContentUri ().
Aqui está o código da aula que usei:
fonte