Se seu aplicativo requer um banco de dados e ele vem com dados incorporados, qual é a melhor maneira de enviá-lo? Eu devo:
Pré-crie o banco de dados SQLite e inclua-o no
.apk
?Inclua os comandos SQL no aplicativo e faça com que ele crie o banco de dados e insira os dados no primeiro uso?
As desvantagens que vejo são:
Possíveis incompatibilidades de versão do SQLite podem causar problemas e, atualmente, não sei para onde o banco de dados deve ir e como acessá-lo.
Pode levar muito tempo para criar e preencher o banco de dados no dispositivo.
Alguma sugestão? Os ponteiros da documentação sobre quaisquer problemas seriam muito apreciados.
android
android-sqlite
android-database
Heikki Toivonen
fonte
fonte
Respostas:
Existem duas opções para criar e atualizar bancos de dados.
Uma é criar um banco de dados externamente, colocá-lo na pasta de ativos do projeto e copiar todo o banco de dados a partir daí. Isso é muito mais rápido se o banco de dados tiver muitas tabelas e outros componentes. As atualizações são acionadas alterando o número da versão do banco de dados no arquivo res / values / strings.xml. As atualizações seriam realizadas criando um novo banco de dados externamente, substituindo o banco de dados antigo na pasta de ativos pelo novo banco de dados, salvando o banco de dados antigo no armazenamento interno com outro nome, copiando o novo banco de dados da pasta de ativos para o armazenamento interno, transferindo todos os dos dados do banco de dados antigo (que foi renomeado anteriormente) para o novo banco de dados e, finalmente, excluindo o banco de dados antigo. Você pode criar um banco de dados originalmente usando oSQLite Manager FireFox plugin para executar suas instruções sql de criação.
A outra opção é criar um banco de dados internamente a partir de um arquivo sql. Isso não é tão rápido, mas o atraso provavelmente seria imperceptível para os usuários se o banco de dados tivesse apenas algumas tabelas. As atualizações são acionadas alterando o número da versão do banco de dados no arquivo res / values / strings.xml. As atualizações seriam realizadas através do processamento de um arquivo sql de atualização. Os dados no banco de dados permanecerão inalterados, exceto quando o contêiner for removido, por exemplo, descartando uma tabela.
O exemplo abaixo demonstra como usar qualquer método.
Aqui está um arquivo create_database.sql de amostra. Ele deve ser colocado na pasta de ativos do projeto para o método interno ou copiado para "Executar SQL 'do SQLite Manager para criar o banco de dados para o método externo. (NOTA: Observe o comentário sobre a tabela exigida pelo Android).
Aqui está um exemplo de arquivo update_database.sql. Ele deve ser colocado na pasta de ativos do projeto para o método interno ou copiado para "Executar SQL 'do SQLite Manager para criar o banco de dados para o método externo. (NOTA: Observe que todos os três tipos de comentários SQL serão ignorados pelo analisador sql incluído neste exemplo.)
Aqui está uma entrada para adicionar ao arquivo /res/values/strings.xml do número da versão do banco de dados.
Aqui está uma atividade que acessa o banco de dados e depois o usa. ( Nota: convém executar o código do banco de dados em um encadeamento separado se ele usar muitos recursos. )
Aqui está a classe auxiliar do banco de dados em que o banco de dados é criado ou atualizado, se necessário. (NOTA: O Android exige que você crie uma classe que estenda o SQLiteOpenHelper para trabalhar com um banco de dados Sqlite.)
Aqui está a classe FileHelper que contém métodos para fluxo de bytes, cópia de arquivos e análise de arquivos sql.
fonte
A
SQLiteAssetHelper
biblioteca torna essa tarefa realmente simples.É fácil adicionar como dependência gradle (mas um Jar também está disponível para Ant / Eclipse) e, juntamente com a documentação, pode ser encontrado em:
https://github.com/jgilfelt/android-sqlite-asset-helper
Nota: Este projeto não é mais mantido como indicado no link acima do Github.
Conforme explicado na documentação:
Adicione a dependência ao arquivo de construção de notas do seu módulo:
Copie o banco de dados no diretório de ativos, em um subdiretório chamado
assets/databases
. Por exemplo:assets/databases/my_database.db
(Opcionalmente, você pode compactar o banco de dados em um arquivo zip como
assets/databases/my_database.zip
. Isso não é necessário, pois o APK já está compactado como um todo.)Crie uma classe, por exemplo:
fonte
Minha solução não usa nenhuma biblioteca de terceiros nem obriga a chamar métodos personalizados na
SQLiteOpenHelper
subclasse para inicializar o banco de dados na criação. Ele também cuida de atualizações de banco de dados também. Tudo o que precisa ser feito é a subclasseSQLiteOpenHelper
.Pré-requisito:
android_metadata
com um atributolocale
com o valoren_US
, além das tabelas exclusivas do seu aplicativo.Subclassificação
SQLiteOpenHelper
:SQLiteOpenHelper
.private
método dentro daSQLiteOpenHelper
subclasse. Este método contém a lógica para copiar o conteúdo do banco de dados do arquivo de banco de dados na pasta 'assets' para o banco de dados criado no contexto do pacote de aplicativos.onCreate
,onUpgrade
eonOpen
métodos deSQLiteOpenHelper
.Disse o suficiente. Aqui está a
SQLiteOpenHelper
subclasse:Por fim, para obter uma conexão com o banco de dados, basta chamar
getReadableDatabase()
ougetWritableDatabase()
naSQLiteOpenHelper
subclasse e ele cuidará da criação de um banco de dados, copiando o conteúdo do banco de dados do arquivo especificado na pasta 'assets', se o banco de dados não existir.Em resumo, você pode usar a
SQLiteOpenHelper
subclasse para acessar o banco de dados enviado na pasta assets, da mesma maneira que usaria para um banco de dados inicializado usando consultas SQL noonCreate()
método.fonte
Enviando o aplicativo com um arquivo de banco de dados, no Android Studio 3.0
Enviar o aplicativo com um arquivo de banco de dados é uma boa ideia para mim. A vantagem é que você não precisa fazer uma inicialização complexa, que às vezes custa muito tempo, se o conjunto de dados for grande.
Etapa 1: preparar o arquivo de banco de dados
Tenha seu arquivo de banco de dados pronto. Pode ser um arquivo .db ou um arquivo .sqlite. Se você usa um arquivo .sqlite, tudo que você precisa fazer é alterar os nomes de extensão de arquivo. Os passos são os mesmos.
Neste exemplo, preparei um arquivo chamado testDB.db. Possui uma tabela e alguns dados de amostra, como este
Etapa 2: Importar o arquivo para o seu projeto
Crie a pasta de ativos se você não tiver uma. Em seguida, copie e cole o arquivo de banco de dados nessa pasta
Etapa 3: copie o arquivo para a pasta de dados do aplicativo
Você precisa copiar o arquivo do banco de dados para a pasta de dados do aplicativo para poder interagir mais com ele. Esta é uma ação única (inicialização) para copiar o arquivo de banco de dados. Se você chamar esse código várias vezes, o arquivo de banco de dados na pasta de dados será substituído pelo arquivo da pasta de ativos. Esse processo de substituição é útil quando você deseja atualizar o banco de dados no futuro durante a atualização do aplicativo.
Observe que durante a atualização do aplicativo, esse arquivo de banco de dados não será alterado na pasta de dados do aplicativo. Somente a desinstalação irá excluí-lo.
O arquivo do banco de dados precisa ser copiado para a
/databases
pasta. Abra o Gerenciador de arquivos do dispositivo. Digite adata/data/<YourAppName>/
localização. Esta é a pasta de dados padrão do aplicativo mencionada acima. E, por padrão, o arquivo do banco de dados será colocado em outra pasta chamada bancos de dados nesse diretórioAgora, o processo de cópia de arquivo é muito parecido com o que o Java está fazendo. Use o código a seguir para copiar e colar. Este é o código de iniciação. Também pode ser usado para atualizar (substituindo) o arquivo do banco de dados no futuro.
Atualize a pasta para verificar o processo de cópia
Etapa 4: Criar auxiliar aberto do banco de dados
Crie uma subclasse para
SQLiteOpenHelper
, com connect, close, path, etc.DatabaseOpenHelper
Etapa 5: criar classe de nível superior para interagir com o banco de dados
Essa será a classe que lê e grava seu arquivo de banco de dados. Também há uma consulta de amostra para imprimir o valor no banco de dados.
Etapa 6: teste em execução
Teste o código executando as seguintes linhas de códigos.
Aperte o botão de correr e torcer!
fonte
Em novembro de 2017, o Google lançou a Biblioteca de Persistência de Sala .
A partir da documentação:
O banco de dados da sala possui um retorno de chamada quando o banco de dados é criado ou aberto pela primeira vez. Você pode usar o criar retorno de chamada para preencher seu banco de dados.
Código desta postagem do blog .
fonte
Pelo que vi, você deveria estar enviando um banco de dados que já possui as tabelas e os dados de configuração. No entanto, se você quiser (e dependendo do tipo de aplicativo que você possui), poderá permitir a "opção de atualização do banco de dados". Então, o que você faz é baixar a versão mais recente do sqlite, obter as instruções mais recentes de Inserir / Criar de um arquivo de texto hospedado online, executar as instruções e fazer uma transferência de dados do db antigo para o novo.
fonte
Finalmente eu consegui !! Usei este link help Usando seu próprio banco de dados SQLite em aplicativos Android , mas tive que alterá-lo um pouco.
Se você possui muitos pacotes, deve colocar o nome do pacote principal aqui:
private static String DB_PATH = "data/data/masterPakageName/databases";
Mudei o método que copia o banco de dados da pasta local para a pasta emulador! Ocorreu algum problema quando essa pasta não existia. Então, primeiro, verifique o caminho e, se não estiver lá, crie a pasta.
No código anterior, o
copyDatabase
método nunca foi chamado quando o banco de dados não existia e ocheckDataBase
método causou exceção. então mudei um pouco o código.Se o seu banco de dados não tiver uma extensão de arquivo, não use o nome do arquivo com uma.
funciona bem para mim, espero que seja útil para você também
fonte
Atualmente, não há como pré-criar um banco de dados SQLite para enviar com seu apk. O melhor que você pode fazer é salvar o SQL apropriado como um recurso e executá-los no seu aplicativo. Sim, isso leva à duplicação de dados (as mesmas informações existem como um reagrupamento e como um banco de dados), mas não há outra maneira no momento. O único fator atenuante é o arquivo apk é compactado. Minha experiência é de 908 KB para menos de 268 KB.
O tópico abaixo tem a melhor discussão / solução que encontrei com um bom código de exemplo.
http://groups.google.com/group/android-developers/msg/9f455ae93a1cf152
Eu armazenei minha instrução CREATE como um recurso de string para ser lido com Context.getString () e a executei com SQLiteDatabse.execSQL ().
Armazenei os dados para minhas inserções em res / raw / inserts.sql (criei o arquivo sql, mais de 7000 linhas). Usando a técnica do link acima, digitei um loop, li o arquivo linha por linha e concatenei os dados em "INSERT INTO tbl VALUE" e fiz outro SQLiteDatabase.execSQL (). Não faz sentido salvar 7000 "INSERT IN tbl VALUE" s quando eles podem ser concatenados.
Demora cerca de vinte segundos no emulador, não sei quanto tempo isso levaria em um telefone real, mas isso só acontece uma vez, quando o usuário inicia o aplicativo.
fonte
INSERT INTO table VALUES(...) VALUES(...) VALUES(...) ...
(1 linha de inserção deve ter 100 VALUES). Será muito mais eficiente e reduzirá o tempo de inicialização de 20 segundos para 2 ou 3 segundos.Enviar o banco de dados dentro do apk e copiá-lo para
/data/data/...
duplicará o tamanho do banco de dados (1 em apk, 1 emdata/data/...
) e aumentará o tamanho do apk (é claro). Portanto, seu banco de dados não deve ser muito grande.fonte
O Android já fornece uma abordagem de gerenciamento de banco de dados com reconhecimento de versão. Essa abordagem foi aproveitada na estrutura BARACUS para aplicativos Android.
Permite gerenciar o banco de dados ao longo de todo o ciclo de vida da versão de um aplicativo, podendo atualizar o banco de dados sqlite de qualquer versão anterior para a atual.
Além disso, ele permite executar hot-backups e hot-recovery do SQLite.
Não tenho 100% de certeza, mas uma recuperação a quente para um dispositivo específico pode permitir que você envie um banco de dados preparado no seu aplicativo. Mas não tenho certeza sobre o formato binário do banco de dados que pode ser específico para determinados dispositivos, fornecedores ou gerações de dispositivos.
Como o material é a Licença 2 do Apache, sinta-se à vontade para reutilizar qualquer parte do código, que pode ser encontrada no github
EDIT:
Se você deseja enviar dados apenas, considere instanciar e persistir POJOs no primeiro início do aplicativo. O BARACUS recebeu um suporte interno para isso (armazenamento de valores-chave interno para informações de configuração, por exemplo, "APP_FIRST_RUN" mais um gancho de inicialização após o contexto para executar operações pós-inicialização no contexto). Isso permite que você envie dados acoplados estreitos com seu aplicativo; na maioria dos casos, isso se encaixava nos meus casos de uso.
fonte
Se os dados necessários não forem muito grandes (os limites que eu não conheço, dependerão de muitas coisas), você também poderá fazer o download dos dados (em XML, JSON, o que for) de um site / aplicativo da web. Após receber, execute as instruções SQL usando os dados recebidos, criando suas tabelas e inserindo os dados.
Se o seu aplicativo móvel contiver muitos dados, poderá ser mais fácil posteriormente atualizar os dados nos aplicativos instalados com dados ou alterações mais precisas.
fonte
Modifiquei a classe e as respostas para a pergunta e escrevi uma classe que permite atualizar o banco de dados via DB_VERSION.
Usando uma classe.
Na classe de atividade, declare variáveis.
No método onCreate, escreva o seguinte código.
Se você adicionar um arquivo de banco de dados à pasta res / raw, use a seguinte modificação da classe.
http://blog.harrix.org/article/6784
fonte
Eu escrevi uma biblioteca para simplificar esse processo.
Ele criará um banco de dados a partir do
assets/databases/myDb.db
arquivo. Além disso, você terá todas essas funcionalidades:Clone-o no github .
fonte
Estou usando o ORMLite e o código abaixo funcionou para mim
Observe que o código extrai o arquivo de banco de dados de um arquivo zip nos ativos
fonte