2
Most examples and tutorials of Android applications out there assume that you want to create and populate your database at runtime and will not use an independent database with your application.
I created a NO sqlite3 database that is called FOPAGRH and read some articles on the internet to copy the Database in the Assets folder and use the code attached, but there are some errors shown in the logcat.
I use the android studio platform for developing 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)
Follows 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 Formulario1 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.Idtable); 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();
}
}
It seems that the error is when instantiating the Assetsdb object, can post the code that does this?
– Emerson Dallagnol
Emerson, I edited my question and I put the class that instance.
– RICCI
Activity needs to have an empty constructor, you cannot have that "Formulario1(Context ctx)"
– Emerson Dallagnol