10

In main activity I have this method which copies files from assets to the databases folder:

try{
    // CHECK IS EXISTS OR NOT
    SQLiteDatabase dbe = SQLiteDatabase.openDatabase("/data/data/com.henanet.dalel/databases/mydb.sqlite",null, 0);
    dbe.close();
    // COPY IF NOT EXISTS
    AssetManager am = getApplicationContext().getAssets();
    OutputStream os = new FileOutputStream("/data/data/com.henanet.dalel/databases/mydb.sqlite");
    byte[] b = new byte[100];
    int r;
    InputStream is = am.open("mydb.sqlite");
    while ((r = is.read(b)) != -1) {
        os.write(b, 0, r);
    }
    is.close();
    os.close();
}
catch(Exception e)
{

}

But once the user installs the app, he gets this error in LogCat:

09-14 22:57:25.694: I/Database(19903): sqlite returned: error code = 14, msg = cannot               open file at source line 25467
09-14 22:57:25.694: E/Database(19903): sqlite3_open_v2("/data/data/com.henanet.dalel/databases/mydb.sqlite", &handle, 2, NULL) failed
Leigh
  • 28,765
  • 10
  • 55
  • 103
New Ques
  • 107
  • 1
  • 1
  • 4

1 Answers1

20

My method

Get Your Database path using the following

ContextWrapper cw =new ContextWrapper(getApplicationContext());
DB_PATH =cw.getFilesDir().getAbsolutePath()+ "/databases/"; //edited to databases

Then you can go this way

private void copyDataBase()
    {
        Log.i("Database",
                "New database is being copied to device!");
        byte[] buffer = new byte[1024];
        OutputStream myOutput = null;
        int length;
        // Open your local db as the input stream
        InputStream myInput = null;
        try
        {
            myInput =myContext.getAssets().open(DB_NAME);
            // transfer bytes from the inputfile to the
            // outputfile
            myOutput =new FileOutputStream(DB_PATH+ DB_NAME);
            while((length = myInput.read(buffer)) > 0)
            {
                myOutput.write(buffer, 0, length);
            }
            myOutput.close();
            myOutput.flush();
            myInput.close();
            Log.i("Database",
                    "New database has been copied to device!");


        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
A.S.
  • 4,574
  • 3
  • 26
  • 43
Trikaldarshiii
  • 11,174
  • 16
  • 67
  • 95
  • 10
    I think at the `DB_PATH =cw.getFilesDir().getAbsolutePath()+ "/Database/"` the last word, **Database** should be `/databases/` – mehmet Apr 11 '14 at 06:38
  • Actually, as per @CommonsWare suggestion in the alternative post answering this question, paths should never be hardcoded. That is entering `"/Database/"`; instead, Use `getDatabasePath()` to derive the path for a database file. – Jorge Apr 20 '18 at 20:19
  • to get the db path:getDatabasePath(DATABASE_NAME).getAbsolutePath(); – live-love Jun 18 '18 at 21:15
  • 1
    that's not working in my case – Bipin Bharti Jul 20 '18 at 07:54