2

I am new to Android development but I am not an amateur programmer. I want to take a small SQLite table (that I have imported from a CSV file) that I have in a database saved on my desktop, and be able to access its contents inside of my application. I do not really need to edit the contents, just read from it.

I found this example of source code on the internet that I thought would do the job, but it is not working as expected. It told me to first save the database into the assets folder. I am clueless as to if I am even going about this the right way, and I am tired of spending time searching on the internet. Any help would be much appreciated!

public class DataBaseHelper extends SQLiteOpenHelper {

    //The Android's default system path of your application database.
    private static String DB_PATH = "/data/data/com.bigapple0208.seth3/databases/";
    private static String DB_NAME = "bigapple0208database"; 
    private SQLiteDatabase myDataBase;  
    private final Context myContext;

    /**
     * Constructor
     * Takes and keeps a reference of the passed context in order to access to the application assets and resources.
     * @param context
     */
    public DataBaseHelper(Context context) {
        super(context, DB_NAME, null, 1);
        this.myContext = context;
    }   

    /**
     * Creates a empty database on the system and rewrites it with your own database.
     **/
    public void createDataBase() throws IOException{
        boolean dbExist = 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) {
                throw new Error("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
     */
    private boolean checkDataBase(){
        SQLiteDatabase checkDB = null;
        try{
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

        }catch(SQLiteException e){
            //database does't exist yet.
        }

        if(checkDB != null){
            checkDB.close();
        }
        return checkDB != null ? true : false;
    }

    /**
     * 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.
     * */
    private void copyDataBase() throws IOException{
        //Open your local db as the input stream
        InputStream myInput = myContext.getAssets().open(DB_NAME);

        // Path to the just created empty db
        String outFileName = DB_PATH + DB_NAME;

        //Open the empty db as the output stream
        OutputStream myOutput = new FileOutputStream(outFileName);

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

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

    }

    public void openDataBase() throws SQLException{
        //Open the database
        String myPath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

    }

    @Override
    public synchronized void close() {
        if(myDataBase != null)
            myDataBase.close();
        super.close();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

    @Override
    public void onUpgrade(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.

}
Roddy of the Frozen Peas
  • 14,380
  • 9
  • 49
  • 99

3 Answers3

3

Include the DB in your assets folder, then take a look at this tutorial. In essence, it copies the DB from assets to /data/data/YOURPACKAGENAME/databases from where you can access it with the platform SQLite classes.

http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/

This is the generally accepted "correct way" of doing it, with a slight variation being to include the DB in your project's res/raw folder.

Simon
  • 14,407
  • 8
  • 46
  • 61
  • http://stackoverflow.com/questions/9109438/how-to-use-existing-database-with-android-app/9109728#9109728 Source code: http://sdrv.ms/N857Wn – Yaqub Ahmad Oct 10 '12 at 06:22
0

I think in checkDatabase() method you should use NO_LOCALIZED_COLLATORS.

When you create the db outside the android project, just make sure you either create the metadata table (as mentioned in the Android docs) or set the SQLiteDatabase.NO_LOCALIZED_COLLATORS flag when calling SQLiteDatabase.openDatabase().

 checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

replace this with

checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);

and same for openDataBase()

SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
Neha.R
  • 513
  • 3
  • 9
-1

You cant Access the database by giving the static path, its not advisable too, better connect your device with eclipse using USB debugging, then push the database into it using DDMS

Manoj Kumar
  • 1,510
  • 3
  • 20
  • 40