Read sqlite3 database in Assets folder

Asked

Viewed 484 times

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, I edited my question and I put the class that instance.

  • Activity needs to have an empty constructor, you cannot have that "Formulario1(Context ctx)"

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.