As pessoas constantemente me perguntam como criar um banco de dados SQLite no Android que já venha com alguns registros. No meu post sobre SQLite no Android eu recomendo que isso seja feito na classe SQLiteOpenHelper através de um arquivo XML (por exemplo) por ser uma forma padronizada e centralizada para manutenção dos BDs no Android.
Entretanto algumas pessoas querem mesmo é copiar um banco de dados já prontinho pra aplicação, e que diga-se de passagem pode ser uma boa opção. Desta forma, segue abaixo o código que faz isso:
class Util {
public static void copiaBanco(
Context ctx, String nomeDB){
// Cria o banco vazio
SQLiteDatabase db = ctx.openOrCreateDatabase(
nomeDB, Context.MODE_WORLD_WRITEABLE, null);
db.close();
try {
// Abre o arquivo que deve estar na pasta assets
InputStream is = ctx.getAssets().open(nomeDB);
// Abre o arquivo do banco vazio ele fica em:
// /data/data/nome.do.pacote.da.app/databases
FileOutputStream fos = new FileOutputStream(
ctx.getDatabasePath(nomeDB));
// Copia byte a byte o arquivo do assets para
// o aparelho/emulador
byte[] buffer = new byte[1024];
int read;
while ((read = is.read(buffer)) > 0){
fos.write(buffer, 0, read);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Notem alguns detalhes interessantes aqui. O método openOrCreateDatabase além de criar a pasta "databases" dentro do diretório onde os bancos de dados devem ficar, ele cria também o arquivo de banco de dados, só que vazio. Uma vez com a estrutura pronta, basta abrir o banco de dados que está com as informações (que no meu exemplo coloquei na pasta "assets") e sobrepor o banco vazio.
Para chamar o método de uma Activity e visualizar uma informação do banco fazemos conforme abaixo:
// carroDB é nome do banco e deve
// ser o nome do arquivo do banco
Util.copiaBanco(this, "carroDB");
SQLiteDatabase db = openOrCreateDatabase(
"dbCarro", MODE_WORLD_WRITEABLE, null);
Cursor c = db.query("carro", null, null, null, null, null, null);
while (c.moveToNext()){
Log.d("NGVL", "Carro: "+ c.getString(1));
}
c.close();
db.close();
4br4ç05,
nglauber