title: Android - Could not open database
body: <p>I have my <code>db.sqlite</code> file in the <code>Asset</code> folder and I get this error when I try to open it:</p>
  
  <blockquote>
    <p>android.database.sqlite.SQLiteCantOpenDatabaseException: unknown
    error (code 14): Could not open database</p>
  </blockquote>
  
  <p>I've tried different paths and names (with and without the extension) but I can't make it work.</p>
  
  <pre><code>package com.example.APP.db;
  
  import java.io.File;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.OutputStream;
  
  import android.content.Context;
  import android.database.SQLException;
  import android.database.sqlite.SQLiteDatabase;
  import android.database.sqlite.SQLiteException;
  import android.database.sqlite.SQLiteOpenHelper;
  import android.widget.Toast;
  
  public class DataBaseHelper extends SQLiteOpenHelper {
  
  // The Android's default system path of your application database.
  private static String DB_PATH = "/data/data/com.example.APP/databases/";
  private static String DB_NAME = "app";
  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(){
          boolean checkdb = false;
          try{
              String myPath = myContext.getFilesDir().getAbsolutePath().replace("files", "databases")+File.separator + DB_NAME;
              File dbfile = new File(myPath);                
              checkdb = dbfile.exists();
          }
          catch(SQLiteException e){
              System.out.println("Database doesn't exist");
          }
  
          return checkdb;
      }
  
  /**
   * 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)) &gt; 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) {
  
  }
  }
  </code></pre>
  
  <p>I get the error when I try to open it here:</p>
  
  <pre><code>package com.example.APP;
  
  import android.app.Activity;
  import android.os.Bundle;
  import android.widget.TextView;
  import com.example.APP.db.DataBaseHelper;
  
  
  public class SpeakersListActivity extends Activity {
  
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.mylayout);      
  
      DataBaseHelper dbHelper = new DataBaseHelper(this);
      dbHelper.openDataBase();
  }
  }
  </code></pre>