title: Android application force closing on device
body: <p>On the Emulator the app runs fine. On the device the moment im trying to copy my database over the application's database and execute a query the app force closes. Any idea why this could be happening? Do i have to request any kind of permissions or something in manifest for it to run?</p>
  
  <p><strong>Database.Java</strong></p>
  
  <pre><code>public class Database extends SQLiteOpenHelper{
  
  //The Android's default system path of your application database.
  private static String DB_PATH = "/data/data/gr.BHC.www/databases/";
  
  //Name of the Database to be created.
  private static String DB_NAME = "BHCLibrary3.sqlite";
  
  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 Database(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{
  
      //First we check if the database already exists, Method declared later
      boolean dbExist = checkDataBase(); 
  
      if(dbExist){
          //do nothing - database already exists
      }else{
  
          //By calling this method an empty database will be created into the default system path
             //of your application so we are going to be able to overwrite that database with our database.
          this.getReadableDatabase();
  
          try {
              copyDataBase(); //Method declared later
  
          } 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;
      boolean checkdb = false;
      try{
          String myPath = DB_PATH + DB_NAME;
          File dbfile = new File(myPath);
          //checkdb = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READWRITE);
          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 transferring byte stream.
   * */
  
  
  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();
  
  }
  
  
  //Opening the Database
  public void openDataBase() throws SQLException{
  
      //Open the database
      String myPath = DB_PATH + DB_NAME;
      myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
  
  
  }
  
  //Finally overriding a few methods as required
  
  @Override
  public synchronized void close() {
  
          if(myDataBase != null)
              myDataBase.close();
  
          super.close();
  
  }
  
  @Override
  public void onCreate(SQLiteDatabase db) {
  
      //First we check if the database already exists, Method declared later
      boolean dbExist = checkDataBase(); 
  
      if(dbExist){
          //do nothing - database already exists
      }else{
  
          //By calling this method an empty database will be created into the default system path
             //of your application so we are going to be able to overwrite that database with our database.
          this.getReadableDatabase();
  
          try {
              copyDataBase(); //Method declared later
  
          } catch (IOException e) {
              throw new Error("Error copying database");
            }
      }
  }
  
  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  
  }
  </code></pre>
  
  <p>}</p>
  
  <p>And <strong>Results.java</strong> (The activity i run my query)</p>
  
  <pre><code>public class SearchResults extends ListActivity {
  
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.searchresults);
  
  
      Database myDbHelper = new Database(null);
      myDbHelper = new Database(this);
  
    }
  
  
  
   // Get the intent, verify the action and get the query
      Intent intent = getIntent();
      String query = intent.getStringExtra(SearchManager.QUERY);
  
  
      SQLiteDatabase myDb = myDbHelper.getReadableDatabase();
  
   //Executing our query against the server using rawQuery and getting the cursor
      String select="SELECT DISTINCT b._ISBN as _id, b.BookTitle, b.Edition, b.Year, b.Pages, b.Rating, c.Category, p.Publisher, w.LastName" +
              "   FROM" +
              "   Books b" +
              "   JOIN Categories_Books cb ON cb._Books_ISBN = _id" +
              "   JOIN Categories c ON c._CategoryID = cb._Categories_CategoryID" +
              "   JOIN Publishers p ON p._PublisherID = b.PublisherID" +
              "   JOIN Writers_Books wb ON wb._Books_ISBN = _id" +
              "   JOIN Writers w ON w._WriterID = wb._Writers_WriterID" +
              "   WHERE b.BookTitle LIKE '%" + query +"%'" +
              "   OR c.Category LIKE '%" + query +"%'" +
              "   OR p.Publisher LIKE '%" + query +"%'" +
              "   OR w.LastName LIKE '%" + query +"%'" +
              "   OR _id LIKE '%" + query +"%'" +
              "   GROUP BY b.BookTitle";
  
  
      Cursor c = myDb.rawQuery(select, null);
      startManagingCursor(c);
  
  
  
   // the desired columns to be bound
      String[] columns = new String[] { "Books.BookTitle", "Publishers.Publisher" }; 
   // the XML defined views which the data will be bound to
      int[] to = new int[] { R.id.ISBN_entry, R.id.Title_entry };
  
   //Getting results into our listview
      try
      {
          SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.listlayout, c, columns, to);
          this.setListAdapter(mAdapter);
      }
      catch( Exception e)
      {
  
      }
  }
  </code></pre>
  
  <p>}</p>
  
  <p>Help would be appreciated.</p>
  
  <p>EDIT: The error im getting is : java.lang.runtimeexception: Unable to start activity Componentinfo(gr.BHC.www/gr.BHC.www.SearchResults} and then various exceptions saying table books etc dont exist.</p>
  
  <p>EDIT2: I saw the exception im getting usually related with content providers but i still cant figure out why i'd get that.</p>