Skip to content Skip to sidebar Skip to footer

Unable To Use External Database In Android App

I want to use my external datbase in MySQL. I have an archived database databse.db.zip and have copied it in the assets folder of my Android Java project. Finally I have created a

Solution 1:

i wanna use my external datbase in mysql , i have zipping this (databse.db.zip) and have copy this in assents folder on my java project

For the record, either you're using the wrong terminology or confused. Android, and the code in your post, works with SQLite. It cannot work with MySQL.

When something doesn't work, read the error message, which usually explains the problem, for example:

09-26 15:20:23.764 1099-1099/? E/SQLiteLog﹕ (1) no such table: prima

A table named "prima" does not exist in the file.

The next step to debug would be to check the content of the file on your PC, using the sqlite3 command line tool or similar, and see what tables it has (.schema command).

Solution 2:

First : You are not copying the Database file from your assets file to your device, which will obviously result into no such table found.

Try this code, its working for me. (Also i have commented different sections for your understanding)

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Build;
import android.util.Log;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
* Created by HP-HP on 23-07-2015.
*/publicclassDataBaseHelperextendsSQLiteOpenHelper {

//The Android's default system path of your application database.privatestatic String DB_PATH ;

privatestaticStringDB_NAME="profanityv2";

private SQLiteDatabase myDataBase;

privatefinal Context myContext;

/**
 * Constructor
 * Takes and keeps a reference of the passed context in order to access to the application assets and resources.
 * @param context
 */publicDataBaseHelper(Context context) {

    super(context, DB_NAME, null, 1);

    if(android.os.Build.VERSION.SDK_INT >= 4.2){
        DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
    } else {
        DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
    }

    this.myContext = context;
}

/**
 * Creates a empty database on the system and rewrites it with your own database.
 * */publicvoidcreateDataBase()throws IOException {

    booleandbExist= checkDataBase();

    if(dbExist){
        //do nothing - database already exist
    }else{

        //By calling this method and empty database will be created into the default system path//of your application so we are gonna be able to overwrite that database with our database.this.getReadableDatabase();

        try {

            copyDataBase();

        } catch (IOException e) {

            thrownewError("Error copying database");

        }
    }

}

/**
 * Check if the database already exist to avoid re-copying the file each time you open the application.
 * @return true if it exists, false if it doesn't
 */privatebooleancheckDataBase(){

    SQLiteDatabasecheckDB=null;

    try{
        StringmyPath= DB_PATH + DB_NAME;
        checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

    }catch(SQLiteException e){

        //database does't exist yet.try {
            myContext.deleteDatabase("profanity");
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }

    if(checkDB != null){

        checkDB.close();

    }

    return checkDB != null;
}

/**
 * Copies your database from your local assets-folder to the just created empty database in the
 * system folder, from where it can be accessed and handled.
 * This is done by transfering bytestream.
 * */privatevoidcopyDataBase()throws IOException{

    //Open your local db as the input streamInputStreammyInput= myContext.getAssets().open(DB_NAME);

    // Path to the just created empty dbStringoutFileName= DB_PATH + DB_NAME;

    //Open the empty db as the output streamOutputStreammyOutput=newFileOutputStream(outFileName);

    //transfer bytes from the inputfile to the outputfilebyte[] buffer = newbyte[1024];
    int length;
    while ((length = myInput.read(buffer))>0){
        myOutput.write(buffer, 0, length);
    }

    //Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();

}

publicvoidopenDataBase()throws SQLException {

    //Open the databaseStringmyPath= DB_PATH + DB_NAME;
    myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS|SQLiteDatabase.CREATE_IF_NECESSARY );

}

@Overridepublicsynchronizedvoidclose() {

    if(myDataBase != null)
        myDataBase.close();

    super.close();

}

public Cursor getData() {
    Cursorc=null;
    try {
        c = myDataBase.rawQuery("SELECT * FROM profanity_table", null);
    } catch (Exception e) {
        e.printStackTrace();
    }
    // Note: Master is the one table in External db. Here we trying to access the records of table from external db.return c;
}


@OverridepublicvoidonCreate(SQLiteDatabase db) {

}

@OverridepublicvoidonUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

// Add your public helper methods to access and get content from the database.// You could return cursors by doing "return myDataBase.query(....)" so it'd be easy// to you to create adapters for your views.

}

usage :

DataBaseHelperdataBaseHelper=newDataBaseHelper(this);

    try {
        dataBaseHelper.createDataBase();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {

        dataBaseHelper.openDataBase();

    }catch(SQLException sqle){

        throw sqle;

    }

    Cursorc= dataBaseHelper.getData();

    if(c!=null) {
        /* your cursor code */
        c.close();
    }


    dataBaseHelper.close();

*Note : Some Devices may not be able to able to copy the database to the device.(Known Devices : OnePlus)

Don't forget to add this permission

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

in your manifest.

Edit 1: OnePlus is able to copy the database to /data/data/<package-name>/databases/<filename>.db but it doesn't allow to access that data and i have no clue regarding that.

Post a Comment for "Unable To Use External Database In Android App"