Diego Rubin

Fullstack Developer

Entre em contato

Desenvolvimento para Android - Carregando um banco SQLite criado externamente

Ereader icon

Introdução

No artigo anterior, Trabalhando com SQLite, ao criar o banco de dados nós também o populamos com algumas informações que eram necessárias para nossa aplicação. Neste caso eram poucas as informações que iriamos utilizar.

Agora, no caso de termos um banco de dados com um números razoável de informação seria interessante utilizarmos um arquivo sqlite criado previamente. Este artigo tem como objetivo mostrar como podemos utilizar um arquivo do sqlite criado externamente em nossa aplicação.

Criação do banco de dados

Seguindo nosso exemplo iremos criar um banco de dados no sqlite chamado linguagens.sqlite. Os comandos sql estão logo abaixo, você pode utilizar sua aplicação favorita para criar este banco ou se você não tem nenhuma experiencia com o sqlite pode seguir os seguintes passos. O sqlite3 está instalado junto com o Android SDK. O comando pode ser encontrado em android-sdk/tools/sqlite3.

./sqlite3 linguagens.sqlite

Após isso digite os comandos sql abaixo.

CREATE TABLE linguagens (
  id INT AUTO_INCREMENT,
  nome VARCHAR(100),
  descricao VARCHAR(200),
  primary key(id)
);

INSERT INTO linguagens VALUES(1, 'Ruby', 'Sobre a linguagem Ruby'); INSERT INTO linguagens VALUES(2, 'Python', 'Sobre a linguagem Python'); INSERT INTO linguagens VALUES(3, 'Perl', 'Sobre a linguagem Perl'); INSERT INTO linguagens VALUES(4, 'Lua', 'Sobre a linguagem Lua'); INSERT INTO linguagens VALUES(5, 'PHP', 'Sobre a linguagem PHP'); INSERT INTO linguagens VALUES(6, 'Go', 'Sobre a linguagem Go');

Além da tabela com nossas informações, também é necessário criarmos uma tabela de controle do android, para isso utilizaremos os seguintes comandos sql. Se essa tabela não for criada, o sistema irá disparar um exception ao abrir o arquivo.

CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'pt_BR');

INSERT INTO "android_metadata" VALUES ('pt_BR');

Após ter o arquivo criado, copie o mesmo para o diretório assets da aplicação.

Usando o banco de dados criado

Agora teremos que fazer algumas alteracões na classe DatabaseHelper para utilizar o banco que criamos ao invés de criar um novo arquivo. Mais um vez, todas as explicações sobre as mudanças realizadas estão comentadas no próprio código e qualquer dúvida pode ser envidas através do sistema de comentários do site.

Arquivo: DatabaseHelper.java

package com.diegorubin.search_list;

import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;

import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {

/** * Este é o endereço onde o android salva os bancos de dados criado pela aplicação, * /data/data/<namespace da aplicacao>/databases/ */ private static String DBPATH = "/data/data/com.diegorubin.search_list/databases/";

// Este é o nome do banco de dados que iremos utilizar private static String DBNAME ="linguagens.sqlite";

private Context context;

/** * O construtor necessita do contexto da aplicação / public DatabaseHelper(Context context) { / O primeiro argumento é o contexto da aplicacao * O segundo argumento é o nome do banco de dados * O terceiro é um pondeiro para manipulação de dados, * não precisaremos dele. * O quarto é a versão do banco de dados */ super(context, "linguagens.sqlite", null, 1); this.context = context; }

/** * Os métodos onCreate e onUpgrade precisam ser sobreescrito / @Override public void onCreate(SQLiteDatabase db) { / * Estamos utilizando o banco do assets, por isso o * código antigo deste método não é mais necessário. */ }

@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { /* * Estamos criando a primeira versão do nosso banco de dados, * então não precisamos fazer nenhuma alteração neste método. * */ }

/** * Método auxiliar que verifica a existencia do banco * da aplicação. */ private boolean checkDataBase() {

SQLiteDatabase db = null;

try {
  String path = DBPATH + DBNAME;
  db = 
    SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
  db.close();
} catch (SQLiteException e) {
  // O banco não existe
}

// Retorna verdadeiro se o banco existir, pois o ponteiro irá existir,
// se não houver referencia é porque o banco não existe
return db != null;

}

private void createDataBase() throws Exception {

// Primeiro temos que verificar se o banco da aplicação
// já foi criado
boolean exists = checkDataBase();

if(!exists) {
  // Chamaremos esse método para que o android
  // crie um banco vazio e o diretório onde iremos copiar
  // no banco que está no assets.
  this.getReadableDatabase();

  // Se o banco de dados não existir iremos copiar o nosso
  // arquivo em /assets para o local onde o android os salva
  try {
    copyDatabase();
  } catch (IOException e) {
    throw new Error("Não foi possível copiar o arquivo");
  }

}

}

/** * Esse método é responsável por copiar o banco do diretório * assets para o diretório padrão do android. */ private void copyDatabase() throws IOException {

String dbPath = DBPATH + DBNAME;

// Abre o arquivo o destino para copiar o banco de dados
OutputStream dbStream = new FileOutputStream(dbPath);

// Abre Stream do nosso arquivo que esta no assets
InputStream dbInputStream = 
  context.getAssets().open("linguagens.sqlite");

byte[] buffer = new byte[1024];
int length;
while((length = dbInputStream.read(buffer)) > 0) {
  dbStream.write(buffer, 0, length);
}

dbInputStream.close();

dbStream.flush();
dbStream.close();

}

public SQLiteDatabase getDatabase() {

try{
  // Verificando se o banco já foi criado e se não foi o
  // mesmo é criado.
  createDataBase();

  // Abrindo database
  String path = DBPATH + DBNAME;

  return SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE);
}catch (Exception e) {
  // Se não conseguir copiar o banco um novo será retornado
  return getWritableDatabase();
}

} }

Consideração importante

Lembrando que estamos em um dispositivo com bem menos recursos de memória que um computador temos que levar em consideração o tamanho do arquivo que iremos copiar no diretório assets. Tive problemas ao abrir um arquivo com 4mb. Por isso recomendo que para evitar problemas, se você for utilizar essa técnica divida o arquivo em pedaços menores e ao copiar o banco leia um pedaço por vez e escreva-os no dbStream. No GNU/Linux essa divisão pode ser feita utilizando o comando split, como no exemplo abaixo:

split arquivo.sqlite -b 1000000

O comando acima divide o arquivo.sqlite em pedaços de 1000000 bytes ou quase 1 mega.

Então o código do método copyDatabase() ficaria assim:

private void copyDatabase()
throws IOException {

String dbPath = DBPATH + DBNAME;

// Abre o arquivo o destino para copiar o banco de dados OutputStream dbStream = new FileOutputStream(dbPath);

// NUMEROPEDACOS: número total de arquivos gerado após a divisão // PREFIX: string que prefixa cada pedaço for(int i = 1; i <= NUMEROPEDACOS; i++){ // Abre Stream do nosso arquivo que esta no assets InputStream dbInputStream = context.getAssets().open(PREFIX + i);

byte[] buffer = new byte[1024];
int length;
while((length = dbInputStream.read(buffer)) &gt; 0) {
  dbStream.write(buffer, 0, length);
}

dbInputStream.close();

}

dbStream.flush(); dbStream.close();

}

Conclusão

Minha intenção com este arquivo era demonstrar como utilizar um banco de dados criado previamente em uma aplicação android. Esse tipo de procedimento foi necessário em uma aplicação que desenvolvi e espero que seja útil para mais alguém.

Para esse exemplo foi necessário a alteração apenas de um arquivo do projeto que estamos utilizando de exemplo. Criei uma tag no repositório do blog e o projeto completo pode ser obtido lá.

Qualquer dúvida utilizem o sistema de comentário do site, terei o maior prazer em respondê-las.

Novo Comentário

Comentários

Brother, só uma duvida...como eu crio a sessão com o banco eu digo, como executaria um codigo sql por ai...

Rodrigo,

para você executar um comando sql você pode utilizar o seguinte código:

DatabaseHelper dh= new DatabaseHelper(getApplicationContext());

SQLiteDatabase db = dh.getDatabase();

Cursor cursos = db.query("select * from tabela");

Veja também esses links:

http://diegorubin.com/2012/02/18/desenvolvimento-para-android-trabalhando-com-sqlite

https://github.com/diegorubin/blog/tree/master/SearchList -> Código fonte completo do projeto

Obrigado pelo seu comentário e se ainda tiver alguma dúvida é só perguntar.

Viva Diego.

Fiz o download do projecto mas sempre que corro dá um fatal exception: main não sei o que fazer.

Este projecto é mesmo aquilo que eu preciso, acesso a uma base de dados para retirar informação e trata-la.

Obrigado.

Tiago,

estou sem o ambiente e desenvolvimento para testar neste momento. Só vou poder testar a aplicação a noite.

Mas enquanto isso, você baixou o projeto completo do github? Se sim, tente este link também: http://diegorubin.com/uploads/asset/file/4f688fa184c11463dc00002e/searchlist.zip

Sei de usuários que utilizaram este pacote e funcionou.

Se continuar o erro, você poderia enviar o stacktrace?

[]'s

Diego,

sim fiz o download dos projectos que estavam no github, inicialmente dava o erro "Unable to resolve target 'android-7'" mas eu dei a volta criando um projecto novo e fazendo copy paste do código todo assim como os ficheiros xml e consegui compilar apesar do erro que falei anteriormente.

Surge o mesmo erro "Unable to resolve target 'android-7" com este novo projecto por isso não deve correr na mesma.

Fico a aguardar que teste no seu ambiente e dê uma resposta.

Obrigado, []s

Tiago,

instalei o eclipse e adt no meu computador aqui, baixei o pacote que indiquei e utilizei a ferramenta de importação do eclipse para executar meu projeto. Ele rodou sem nenhum problema.

Você tem a versão da Api 7 instalada ai? Se não tiver ou você precisa instalar ou alterar o target para uma Api que você tenha instalada ai.

Bom, instalei um ambiente do zero, importei o projeto do link http://diegorubin.com/uploads/asset/file/4f688fa184c11463dc00002e/searchlist.zip o e código rodou perfeitamente.

Se houver algum outro erro que esteja aparecendo no console eu pesso que envie que eu dou uma olhada.

[]'s

Diego,

o programa já corre! Era problema da API, estava a correr com a 8. Actualizei e coloquei um device com API 7 e corre lindamente.

No entanto você usa listas do tipo JSONObject onde coloca os cursor, o que para mim não deve ser o melhor a utilizar, pretendo fazer várias query's e retirar os valores que pretendo.

Vou analisar melhor o código e ver como posso adaptar ao que quero. Muito obrigado pela sua ajuda.

Abraços.

Olá amigo,

Como poderia usar este código se ao invés de copiar um banco em assets eu copiasse de uma outra pasta do sdcard?

Como ficaria o context?

Obrigado

Olá Alessandro,

primeiramente gostaria de pedir desculpas pela demora em responder. Não recebi a notificação no seu comentário.

Quanto a sua pergunta. Não vai mudar muita coisa não, apenas vai mudar como pegaremos o arquivo. Alterei o método copyDatabase(). O link do snippet é esse: http://diegorubin.com/snippet/android---lendo-arquivo-sqlite-do-sd-card

Testei aqui e funcionou perfeitamente. Copiei o banco para o cartão utilizando o DDMS, se você tiver alguma dúvida de como copiar o arquivo para o cartão. Sugiro este post: http://android-er.blogspot.com.br/2009/10/create-sd-card-in-android-emulator-and.html.

[]'s

Ok obrigado.

O link abaixo não funciona mais, teria outro link para sugerir?

http://android-er.blogspot.com.br/2009/10/create-sd-card-in-android-emulator-and.html.

Obrigado.

Parabéns Diego!

Otimo Topico

Muito Util...

cara como faço pra pegar uma data na hora de cadastrar algo e colocar ela no banco de dados, mais essa hora seria altomático

tem como??

desde já agradeço

Bah cara muito obrigado, deu certinho

ola, vc ja fez alguma migração de tabelas do postgres para o sqlite?

se sim gostaria que enviasse algum material sobre isso.

obrigado

Olá Marcelo.

Nunca fiz esse tipo de migração não.

[]'s

Isso é justamente o que eu estava procurando, no Stackoverflow tem a versão em inglês mas o seu aprofunda mais.

Baixei seu projeto mas não esta funcionando na minha máquina:

LogCat

09-21 11:50:08.636: E/Database(304): sqlite3_open_v2(&quot;/data/data/com.diegorubin.search_list/databases/linguagens.sqlite&quot;, &handle, 1, NULL) failed

09-21 11:50:08.636: E/Database(304): sqlite3_open_v2(&quot;/data/data/com.diegorubin.search_list/databases/linguagens.sqlite&quot;, &handle, 1, NULL) failed

Você imagina o que poderia ser?

Julio,

desculpe, mas de cabeça não sei dizer o porque de não estar funcionando. Sei que varias pessoas já testaram esse código e funcionou.

Estou bastante enrolado com o trampo e com a faculdade e não vou conseguir pesquisar algo agora.

Desculpe novamente.

[]'s

Olá Diego, tenho uma dúvida. Estou desenvolvendo uma aplicação para Android que precisa mostrar informações sobre eventos de um determinado lugar. Ou seja, assim que o usuário acessar o aplicativo ele saberá quais eventos vão ocorrer durante a semana. Pensei em armazenar as informações em um banco de dados e conectar esse banco externo a aplicação. Mas as informações devem ser atualizadas pela escola. Você acha que devo seguir nessa linha de pensamento ou devo tentar de outra forma?Não possuo experiência com Banco de Dados e esse é meu primeiro projeto para android...

Desde já agradeço.

Olá Joyce,

Eu aconselho você a não utilizar uma banco de dados em um servidor para guardas as informações do aplicativo. Você teria alguns problemas com autenticação do banco e manutenção de sessões. Ao invés isso, eu criaria uma aplicação web que iria utilizar as informações do banco e disponibilizaria as mesmas em JSON, por exemplo. Então a aplicação para Android iria receber as informações dessa aplicação web. É uma passo a mais, porém iria simplificar bastante a aplicação no Android.

Espero ter ajudado.

Muito Obrigado Diego! Vou pesquisar esse novo caminho!Mas tenho uma questão. Ao criar a aplicação web, um usuários leigo(no caso, um funcionário da escola) poderia atualizar as informações dos eventos(editar datas, por exemplo) facilmente? Não entendo como as informações podem ser alteradas depois, uma vez que estou testando no emulador mas vou passar para o Galaxy e a partir daí não terei mais contato com a aplicação.

Obrigado novamente :)

Olá Joyce,

desculpe a demora em responder seu comentário.

Então, se você criar um serviço facilitaria a tarefa da atuliazação dos dados. Você poderia criar uma interface web que conecta com o mesmo banco de dados que serve os dados para a aplicacao movel, onde os funcionarios poderiam alterar os dados. Normalmente essa interface faz parte da aplicacao que serve os dados para a aplicacao.

[]'s

Ola Diego Rubin.

Tenho uma duvida em relação ao banco de dados. Me falaram que é um banco pequeno. Estou criando um aplicativo com banco de dados e pretendo colocar 20 registros em cada tabela, em um total de 7 tabelas.

Gostaria de saber se isto é possivel.

Obrigado.

Olá Vitor,

Acho que é muito tranquilo utilizar um banco com o numero de registros que voce mencionou. Eu já desenvolvi uma aplicacao que possuia um banco com uma tabela com mais de 3000 registros e funcionava sem problemas no meu celular que é bem fraco.

[]'s

Olá Diego, estou desenvolvendo uma aplicação e estou com alguns problemas.

Problema 1:

O cliente deve selecionar um estado -em um spinner ou autocompletetextview- e deveria receber as informações deste estado - capital, numero de habitantes, area -em outra tela. Esse problema já está dificil de resolver pois seriam muitos estados - usaria do mundo todo.

Problema 2:

Como não sei exatamente a necessidade de cada cliente, pensei em colocar alguns estados e informações e deixar a possiblidade dele adicionar outros que julgar necessário. O melhor caminho seria editar o banco antes e fazer como você colocou neste post ?!

Obrigado !!!

Olá, eu digito esses comandos no sqlite3(Abre uma tela do prompt) e só da erro.

Diego eu fiz a mesma coisa que você e também segui o tutorial http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/#comment-2048, porém meu banco sempre aparece nulo. Onde eu poderia chamar essa classe? Eu chamo na minha classe inicial. Mas eu estou passando this como parametro, isso está correto?

Estou tentando a alguns dias desenvolver um app baseado neste post, mas não estou conseguindo.

Criei em meu projeto uma cópia do seu DatabaseHelper e tenho uma mainActivity onde tenho um Spinner, gostaria de trazer os dados do banco para este Spinner.

Utilizei este código na minha mainActivity que você descreve logo acima.

DatabaseHelper dh= new DatabaseHelper(getApplicationContext());

SQLiteDatabase db = dh.getDatabase();

Cursor cursos = db.query("select * from tabela");

mas dá erro nesta linha do Cursor e não consigo fazer funcionar..

Tentei também db.rawQuery e outras formas de fazer este cursor, porém nada ainda...

Se puder ajudar Agradeço..

Parabéns pelo excelente conteúdo do site...

Pode parecer bobeira, mas:

Cursor cursos = db.query("select * from tabela");

Tem certeza que trocou a palavra tabela acima pelo nome da tua tabela SQL correspondente no seu aplicativo?

Sendo mais claro: suponha que sua tabela seja sobre armazenar nomes de frutas, e portanto chame-se "fruteira":

Cursor cursos = db.query("select * from fruteira");

O modelo ideal, nesse caso, seria:

______________________________________

public static String TABLE_NAME = &quot;fruteira&quot;;// Lécio: public? É o melhor?

Cursor cursos = db.query("select * from " + TABLE_NAME);

______________________________________

ótimo post, muito bom o conteúdo!

Parabéns pelo site!

Bom dia Diego,

Parabéns pelo artigo, muito bom mesmo !!!

Me esclarece uma coisa por favor, estou usando um bd ja pronto com alguns dados fixos e coloquei o mesmo para embarcar na minha app (porém o banco esta grande algo em torno de 5 MB) eu utilizo Mac OS e não tenho a minha disposição o comando "slice" você teria algum outro comando similar para me auxiliar nessa questão ?? ou alguma sugestão ???

Obrigado

Olá Marcos.

Não tenho um Mac OS para testar aqui, mas tente utilizar o comando split. Deve funcionar pois é um programa do Unix mesmo.

http://unixhelp.ed.ac.uk/CGI/man-cgi?split

[]'s

parabens pela iniciativa...

mais no meu caso me deixou mais confuso...

vc manda um link onde se cria uma tablea android_metadata...ate ai bele

ai com anderline antes do id... (_id) mais vc não faiz nada disso..

ai não sei qual seguir...

"obs" o seu exemplo funciona perfeitamente

parabens

ola Diego, muito bom seu post, embora nao ter testado, mas minha dúvida é q tenho que criar e popular minhas tabelas do bd, na primeira vez, ou quando o usuario, resolver porque fiz uma funcao para importar dados de uma base do mysql da web, me ajude por favor...

Jackeline Puschel

Excelente postagem! Ajudou muito mesmo. Só gostaria de saber se vc sabe como deixar o SQL pronto fora do diretório assets, é possível?

E no caso se eu já tiver um banco de dados com as tabelas? Por exemplo eu tenho o coletor.db, como faria para o android reconhecê-lo para posteriormente eu poder tratar essa minha base de dados na minha aplicação?

Bom dia Diego,

Parabéns pelo artigo, muito bom mesmo !!!

Só uma duvida, como poderia fazer ao contrário, crio o banco na minha aplicação e preciso copiar ele para pasta assets por exemplo, como forma de backup, já li alguns comentários de que não muda muita coisa, mais não consegui usar, tem como da um help ai?

Obrigado

Oioi... estou começando a desenvolver apps pra Android e o seu código está sendo muito útil!

É possível fazer um banco de dados de músicas dessa maneira?

Cara, como faço para recuperar por exemplo um dado do tipo int do banco e salvar em uma variavel do tipo int, porque está sendo recuperado através do JSONobject, e não tem como converter para int, eu preciso trazer o dado do banco e salvar em uma variavel do tiopo int porque essa variavel contem uma coordenada para criar uma overlay no mapa.

MARDOQUEU DE SOUSA

Olá Diego,

Excelente post este seu, me esclareceu muitas duvidas, mas gostaria que se pudesse me ajuda-se um uma coisa.

estou criando um sistema que usará o android para o funcionário receber a rota do dia para trabalho, ele mesmo acessa o sistema no android clica no botão trazer rota e a ideia era a seguinte: fazer um webservice que traria a rota a ser feita para o android preencher o sqllite, mas são mais ou menos 10 tabelas diferentes, então lendo seu tutorial decidi criar o banco de dados sqllite no servidor e repassa-lo ao soft android quando acionado pelo botão.

minha duvida é, tem como o webservice retornar o banco de dados sqllite já pronto, ou o webservice montaria o BD e passaria o link para o android baixa-lo e colocar no assets ?

é minha primeira vez de criar algo do tipo, então por exemplo se criar o banco de dados no webservice e passar o link para o android, como no android eu faria esse download e copiara para o assets ?

Grato pela atenção

Super Diego...

Boa tarde, você não tem ideia de como me foi útil este post, desde já deixo aqui os meus agradecimentos...tive alguns problemas como todos que vi aqui , mas com a sua luz fui indo.Bem tenho uma coisa que não achei em lugar nenhum...Como aproveitar um banco de dados do Access de um sistema na minha APP, este BD não e protegido tenho acesso a ele altero tudo manualmente...Bem fico na esperança de ter uma resposta sua ou de alguém que acompanhe este post,Obrigado e Sucesso!

Excelente artigo Diego parabens otimas explicações.

Mas tenho uma duvida como faço para guarda uma imagem na base e acessa-la depois ?

Ola Diego bom artigo...

Fiz tudo que o tutorial manda mas ta acontecendo uma exception: failed to open database ...

Já verifiquei e minha base esta la no diretorio /assets... O que poderia ser ?

Estou desenvolvendo uma aplicação para android usando banco de dados SQLite e no emulador (Eclipse) funciona perfeitamente. Transfiro o APK para o celular e a aplicação funciona porém não localiza o BD.

Onde devo colocar o BD no celular?

Como transferí-lo junto com o APK?

Grato,

Prezado, gostaria de parabenizar pelo artigo.

Gostaria de uma ajuda sua, como faço para utilizar o método onUpgrade?

Fiz algumas alterações no meu banco, e agora, como faço pra atualizar meu app?

Substitui o banco no assets, até ai beleza... Mas ele não sobrescreve na app.

Sabe me orientar como faço nesse caso?

Obrigado.

Prezado, boa tarde.

Como faço para utilizar o método onUpgrade?

Fiz algumas alterações no banco de dados e preciso substituir o que está sendo usado.

Coloquei o novo banco no assets compilei a app mas não funcionou.

Tem como me orientar?

Tente uma ferramenta gratuita - Valentina Studio. Produto surpreendente! IMO é o melhor SQLite Manager, para todas as plataformas. http://www.valentina-db.com/en/valentina-studio-overview

Amigo criei o banco externamente e estou conseguindo consultar pela aplicação, porém não consigo inserir dados nele, tem alguma restrição ?

Olá, tudo bem?

Eu estou com uma dúvida: Segui o passo a passo do seu post e consegui conectar com um banco de dados já preenchido. Só que eu não consigo selecionar as tabelas desse meu banco, esse erro aparece:

android.database.sqlite.SQLiteException: no such table: WORD_TABLE

Seria muito te pedir ajuda?

Obrigada

Prezado, boa noite.

Como faço para utilizar o método onUpgrade?

Fiz algumas alterações no banco de dados e preciso substituir o que está sendo usado.

Coloquei o novo banco no assets compilei a app mas não funcionou.

Sem perder as informações já cadastrada pelo usuário.

Tem como me orientar?

Boa tarde Diego!

Estou desenvolvendo uma aplicação que utiliza este mesmo estilo de enviar um banco de dados via assets.

Agora estou precisando incluir mais um campo neste banco de dados, mas não consigo fazer a aplicação passar pelo método onUpgrade.

Você sabe como posso fazer este ajuste no banco de dados?

Bom dia

Já procurei ajuda em vários site, mas tive puco sucesso. Vi que vocês entendem mesmo de app, por isso gostaria que me ajudassem. Estou tentando desenvolver um app que fucione online e offline no Android e IOS, já tenho o site e o mobile, mas agora preciso que ele fusione offline e também que ele atualize quando conectar-se à internet.

Obrigado

Att Leomarv

Olá Diego, tudo bem?

Estou seguindo o seu modelo, porém tem uma parte do código que esta destacado em vermelho pra mim:

while ((length = dbInputStream.read(buffer)) &gt; 0)

me parece que é o &gt, só não sei por qual comando posso substituí-lo.

Abraços,

Ariela

Olá Ariela,

O &gt;(greater than) é a notação html para o símobol ">". Em alguma migração que realizei ele deve ter escapado esse símbolo. Vou corrigir lá.

[]'s