Question

I receive the following error dump the data of a file called instalacionesdep.db. The funny thing is that everything is loaded correctly, but in the logcat I get the following error.

12-11 13:05:54.284: E/SqliteDatabaseCpp(17232): sqlite3_open_v2("data/data/com.mipaquete.instalacionesdep/databases/instalacionesdep.db", &handle, 1, NULL) failed
12-11 13:05:54.354: E/SQLiteDatabase(17232): Failed to open the database. closing it.
12-11 13:05:54.354: E/SQLiteDatabase(17232): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file
12-11 13:05:54.354: E/SQLiteDatabase(17232):   at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
12-11 13:05:54.354: E/SQLiteDatabase(17232):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1013)
12-11 13:05:54.354: E/SQLiteDatabase(17232):    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986)
12-11 13:05:54.354: E/SQLiteDatabase(17232):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:962)
12-11 13:05:54.354: E/SQLiteDatabase(17232):     at com.mipaquete.instalacionesdep.db.DataBaseHelper.checkDataBase(DataBaseHelper.java:99)
12-11 13:05:54.354: E/SQLiteDatabase(17232):   at com.mipaquete.instalacionesdep.db.DataBaseHelper.createDataBase(DataBaseHelper.java:72)
12-11 13:05:54.354: E/SQLiteDatabase(17232):  at com.mipaquete.instalacionesdep.db.TodasLasInstalacionesActivity.onClick(TodasLasInstalacionesActivity.java:71)
12-11 13:05:54.354: E/SQLiteDatabase(17232):   at android.view.View.performClick(View.java:3511)
12-11 13:05:54.354: E/SQLiteDatabase(17232):   at android.view.View$PerformClick.run(View.java:14105)
12-11 13:05:54.354: E/SQLiteDatabase(17232):      at android.os.Handler.handleCallback(Handler.java:605)
12-11 13:05:54.354: E/SQLiteDatabase(17232):      at android.os.Handler.dispatchMessage(Handler.java:92)
12-11 13:05:54.354: E/SQLiteDatabase(17232):      at android.os.Looper.loop(Looper.java:137)
12-11 13:05:54.354: E/SQLiteDatabase(17232):  at android.app.ActivityThread.main(ActivityThread.java:4424)
12-11 13:05:54.354: E/SQLiteDatabase(17232):        at java.lang.reflect.Method.invokeNative(Native Method)
12-11 13:05:54.354: E/SQLiteDatabase(17232):     at java.lang.reflect.Method.invoke(Method.java:511)
12-11 13:05:54.354: E/SQLiteDatabase(17232):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-11 13:05:54.354: E/SQLiteDatabase(17232):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-11 13:05:54.354: E/SQLiteDatabase(17232):     at dalvik.system.NativeStart.main(Native Method)

I think closing myDbhelper sometime, but I think that I do all the steps and can not find the fault. This is the summary of my class that extends SQLiteOpenHelper DataBAseHelper code.

public class DataBaseHelper extends SQLiteOpenHelper {

    //Variables ausiliares
    private static String DB_PATH="data/data/com.mipaquete.instalacionesdep/databases/";
    private static final String DB_NAME="instalacionesdep.db";
    //private static final int DATABASE_VERSION =1;


    private SQLiteDatabase myDatabase;
    private final Context myContext;


    public DataBaseHelper(Context context) {
        super(context, DB_NAME, null, 1);
        // TODO Auto-generated constructor stub
        this.myContext = context; 
    }


    public void createDataBase() throws IOException{
        //para chequear que existe la BD
        boolean dbExist = checkDataBase();

        SQLiteDatabase db_read = null;

        if(dbExist){

        }else{
            //agarramos la BD para leerla y despues la cerramos. 
            db_read = this.getReadableDatabase();
            db_read.close();

            try {
                copyDataBase();
            } catch (Exception e) {
                // TODO: handle exception
                throw new Error("Error copying database (createDataBase)");
            }
        }

    }

    public boolean checkDataBase(){
        SQLiteDatabase checkDB = null;
        SQLiteDatabase db_read = null;

        try{
            String myPath = DB_PATH+DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
        }catch (SQLException e) {
            // TODO: handle exception
            File dbFile = new File(DB_PATH+DB_NAME);
            return dbFile.exists();
        }
        if(checkDB != null){
            checkDB.close();

        }

        //regresa un true o un false dependidendo si se cumple la condicion. Los : sustituyen al else
        return checkDB != null ? true : false;
    }

    //vamos a volcar 
    public void copyDataBase() throws IOException{

        InputStream myInput = myContext.getAssets().open(DB_NAME);
        String outFileName = DB_PATH+DB_NAME;

        OutputStream myOutPut = new FileOutputStream(outFileName);

        Log.e("LocAndroid", "ESTOY EN copyDataBase");

        //Para trasnferir el fichero en tamaños de 1024 bytes
        byte[] buffer = new byte[1024];
        int lenght;

        //while para que nos mande el archivo. 
        while((lenght = myInput.read(buffer))!=-1){
            if(lenght > 0){
                myOutPut.write(buffer, 0, lenght);
            //con esto hemos copiado la base de datos. Basicamente, El volcado del archivo

            }

        }
        myOutPut.flush();
        myOutPut.close();
        myInput.close();
    }

    //Para abrir la base de datos
    public void openDataBase() throws SQLException{

        //myDatabase = this.getWritableDatabase();
        String myPath = DB_PATH+DB_NAME;
        myDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
    }

    //Para cerrar la base de datos
    public synchronized void close(){

        if(myDatabase != null){
            myDatabase.close();
        }
        super.close();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    }


}

thank you!

Was it helpful?

Solution

The error was checkdatabase (). Specifically in the lines:

String myPath = DB_PATH+DB_NAME; 
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

The first run always give mistake. Because the database does not exist. checkdatabase must contain only the this code:

File dbFile = new File(DB_PATH+DB_NAME); return dbFile.exists();
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top