Read sqlite3 database in the Assets folder

1

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();
}

}

    
asked by anonymous 18.12.2016 / 00:10

0 answers