title: Copy Sqlite database for android application
body: <p>I am trying to use my own created database in my android application using this tutorial <a href="http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/" rel="nofollow noreferrer">http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/</a></p>
  <p>I have my database in my assets folder have been working for 5 hours to get the work around but in vain.. i always keep getting</p>
  <pre><code>01-17 04:09:07.111: E/Database(1060): sqlite3_open_v2(&quot;/data/data/com.rahul.besttracker/databases/route&quot;, &amp;handle, 1, NULL) failed
  </code></pre>
  <p>and</p>
  <pre><code>01-17 04:09:07.271: E/AndroidRuntime(1060): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rahul.besttracker/com.rahul.besttracker.Busdisplay}: android.database.sqlite.SQLiteException: unable to open database file
  </code></pre>
  <p>my code</p>
  <pre class="lang-java prettyprint-override"><code>public class Busdisplay extends ListActivity {
      TextView source, destination;
      String src, dest;
      ArrayList&lt;String&gt; mArrayList;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          // TODO Auto-generated method stub
          super.onCreate(savedInstanceState);
  
          init();
          Bundle caught = getIntent().getExtras();
          src = caught.getString(&quot;source&quot;);
          dest = caught.getString(&quot;dest&quot;);
  
          DataBaseHelper entry = null;
  
          entry = new DataBaseHelper(Busdisplay.this);
  
          entry.openDataBase();
  
          mArrayList = entry.readEntry(src, dest);
  
          entry.close();
  
          setListAdapter(new ArrayAdapter&lt;String&gt;(this,
                  android.R.layout.simple_list_item_1, mArrayList));
      }
  
      @Override
      protected void onListItemClick(ListView l, View v, int position, long id) {
          // TODO Auto-generated method stub
          super.onListItemClick(l, v, position, id);
      }
  
      void init() {
          source = (TextView) findViewById(R.id.textView1);
          destination = (TextView) findViewById(R.id.textView2);
      }
  
  }
  </code></pre>
  <p>My DBhelper class</p>
  <pre class="lang-java prettyprint-override"><code>public class DataBaseHelper extends SQLiteOpenHelper {
  
      // The Android's default system path of your application database.
      private static final String DB_PATH =   &quot;/data/data/com.rahul.besttracker/databases/&quot;;
  
      private static final String DB_NAME = &quot;route.db&quot;;
      private static final String DB_TABLE1 = &quot;route1&quot;;
      private static final String DB_TABLE2 = &quot;route2&quot;;
      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(&quot;Error copying database&quot;);
  
              }
          }
  
      }
  
      /**
       * 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) {
  
              System.out.print(&quot;ERROR&quot;);
          }
  
          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)) &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) {
          try {
              createDataBase();
          } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
      }
  
      @Override
      public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
          db.execSQL(&quot;DROP TABLE IF EXISTS &quot; + DB_TABLE1);
          db.execSQL(&quot;DROP TABLE IF EXISTS &quot; + DB_TABLE2);
          onCreate(db);
      }
  
      public ArrayList&lt;String&gt; readEntry(String src, String dest) {
  
          // TODO Auto-generated method stub
          Cursor c = myDataBase.rawQuery(&quot;SELECT route_no from &quot; + DB_TABLE1
                  + &quot; WHERE stops LIKE '%&quot; + src + &quot;%,%&quot; + dest + &quot;%';&quot;, null);
          ArrayList&lt;String&gt; mArrayList = new ArrayList&lt;String&gt;();
          int index = c.getColumnIndex(&quot;route_no&quot;);
          for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
              // The Cursor is now set to the right position
              mArrayList.add(c.getString(index));
          }
          return mArrayList;
      }
  
      // Add your public helper methods to access and get content from the
      // database.
      // You could return cursors by doing &quot;return myDataBase.query(....)&quot; so it'd
      // be easy
      // to you to create adapters for your views.
  
  }
  </code></pre>