Most examples and tutorials on Android applications around assume that you want to create and populate your database at runtime and will not use a standalone database with your application. I created a database in sqlite3 which is called FOPAGRH and I read some articles on the internet to copy the database in the Assets folder and use the attached code, however there are some errors presented in logcat. I use the android studio platform to develop my applications.
see the errors:
12-17 23:09:29.584 740-740/androidpro.com.br.AssetsDB E/AndroidRuntime﹕ FATAL EXCEPTION: main java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{androidpro.com.br.AssetsDB/androidpro.com.br.AssetsDB.AssetsDB}: java.lang.InstantiationException: can't instantiate class androidpro.com.br.AssetsDB.AssetsDB; no empty constructor at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1880) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) at android.app.ActivityThread.access$600(ActivityThread.java:123) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4424) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.InstantiationException: can't instantiate class androidpro.com.br.AssetsDB.AssetsDB; no empty constructor at java.lang.Class.newInstanceImpl(Native Method) at java.lang.Class.newInstance(Class.java:1319) at android.app.Instrumentation.newActivity(Instrumentation.java:1023) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1871) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) at android.app.ActivityThread.access$600(ActivityThread.java:123) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4424) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) at dalvik.system.NativeStart.main(Native Method)
Follow my code:
package androidpro.com.br.AssetsDB;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class AssetsDB 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/androidpro.com.br.AssetsDB/databases/";
// Este é o nome do banco de dados que iremos utilizar
private static String DBNAME ="FOPAGRH.DB";
//NÃO TINHA ESSA LINHA, INSERI DIA 15/12/2016
//private SQLiteDatabase FOPAGRH;
private Context context;
// O construtor necessita do contexto da aplicação
public AssetsDB(Context context) {
/// O primeiro argumento é o contexto da aplicacao (context)
//* O segundo argumento é o nome do banco de dados (FOPAGRH.DB)
//* O terceiro é um ponteiro para manipulação de dados, não precisaremos dele. (null)
//* O quarto é a versão do banco de dados (1)
super(context, "FOPAGRH.DB", null, 1);
this.context = context;
}
//Os métodos onCreate e onUpgrade precisam ser sobreescrito
//---------------------------------------------------------
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
throw new Error("O Banco de Dados NÃO EXISTE"); //CRIEI ESSE LINA DIA 16/12/2016
}
// 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 BANCCO DE DADOS 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("FOPAGRH.DB");
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 DE DADOS 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();
}
}
}
package androidpro.com.br.AssetsDB; import android.app.Activity; import android.app.AlertDialog.Builder; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View; import android.widget.EditText;
import java.io.IOException;
public class Form1 extends Activity {
private AssetsDB helper;
public Formulario1(Context ctx) {
helper = new AssetsDB (ctx); }
//--------------
EditText editIDTABELA;
EditText editTABINSSFAIXA001;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tabelas);
AssetsDB myDbHelper;
myDbHelper = new AssetsDB(this);
this.helper = new AssetsDB(this);
try {
myDbHelper.createDataBase();
} catch (IOException ioe) {
throw new Error("Unable to create database");
}
try {
myDbHelper.openDataBase();
} catch (SQLException sqle) {
throw sqle;
}
// Second Part // ------------- editIDTABELA = (EditText) findViewById (R.ID.IDTabela); editTABINSSFAIXA001 = (EditText) findViewById (R.id.INSSFX001);
}
//BOTÃO VER LISTA DE ID TABELA
// ----------------------------- public void btnlistacontatosTAB (View View) { SQLiteDatabase db = helper.getWritableDatabase ();
Cursor c = db.rawQuery("SELECT * FROM Estados", null);
if (c.getCount() == 0) {
showMessage("Erro!!", "Nada Encontrado");
return;
}
StringBuffer buffer = new StringBuffer();
while (c.moveToNext()) {
buffer.append("IDEstado: " + c.getString(0) + "\n" + "Estado: " + c.getString(1) + "\n");
}
showMessage("Detalhes dos Estados", buffer.toString());
}
//ShowMessage
// ----------- public void showMessage (String title, String message) {
Builder builder = new Builder(this);
builder.setCancelable(true);
builder.setTitle(title);
builder.setMessage(message);
builder.show();
}
}