Android SQLite DataBase doesn't work on versions newer than Android 2.1
<p>I'm currently working on an android application that contains SQLite database.. I was trying on emulator with Android 2.1 and it works fine .. but it doesn't work on version newer than Android 2.1 .... 
In my app, I created an external SQLite database on SQLite manager, then i copy this DB to 
"/data/data/" + getPackageName() + "/databases/MyDB" when the application is started for the first time .<br>
Code for copying the DB from assets folder : </p>

<pre><code>try{

                try {           
                    String destPath = "/data/data/" + getPackageName() + "/databases/MyDB";
                    File f = new File(destPath);            
                    if (!f.exists()) {          
                        CopyDB( getBaseContext().getAssets().open("mydb"), 
                            new FileOutputStream(destPath));
                    }
                } catch (FileNotFoundException e) {         
                    e.printStackTrace();
</code></pre>

<p>copyDB function :</p>

<pre><code>public void CopyDB(InputStream inputStream, OutputStream outputStream) 
        throws IOException {
            //---copy 1K bytes at a time---
            byte[] buffer = new byte[1024];
            int length;
            while ((length = inputStream.read(buffer)) &gt; 0) {
                outputStream.write(buffer, 0, length);
            }
            outputStream.flush();
            inputStream.close();
            outputStream.close();
        }
</code></pre>

<p>DBAdapter Class :</p>

<pre><code>public class DBAdapter {
public static final String KEY_ROWID = "_id";
public static final String KEY_NAME = "username";
public static final String KEY_PASSWORD = "password";


private static final String DATABASE_NAME = "MyDB";
private static final String DATABASE_TABLE = "users";
private static final int DATABASE_VERSION = 3;



private final Context context;    

private DatabaseHelper DBHelper;
private SQLiteDatabase db;

public DBAdapter(Context ctx) 
{
    this.context = ctx;
    DBHelper = new DatabaseHelper(context);
}

private static class DatabaseHelper extends SQLiteOpenHelper 
{
    DatabaseHelper(Context context) 
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) 
    {

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    {

    }
}    

//---opens the database---
public DBAdapter open() throws SQLException 
{
    db = DBHelper.getWritableDatabase();
    return this;
}

//---closes the database---    
public void close() 
{
    DBHelper.close();
}


//---retrieves all the users---
public Cursor getAllusers() 
{
    return db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME,
            KEY_PASSWORD}, null, null, null, null, null);
}

//---retrieves a particular user---
public User getuser(String username) throws SQLException 
{

    Cursor mCursor =
            db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
            KEY_NAME, KEY_PASSWORD}, KEY_NAME + "=" + "'"+username+ "'", null,
            null, null, null, null);
    if(mCursor.moveToFirst())
    {
        mCursor.moveToFirst();
        User u=new User(Integer.valueOf(mCursor.getString(0)),mCursor.getString(1),mCursor.getString(2));
        return u;
    }else
        return null;

}

public List&lt;Device&gt; getNotupdatedDevices() {
    List&lt;Device&gt; Devices = new ArrayList&lt;Device&gt;();

    SQLiteDatabase db = DBHelper.getWritableDatabase();
    Cursor myCursor =
            db.query("Devices", new String[] {"_DeviceID","current_state","current_level","current_CD_Channel" }, "updated=?", new String[] {"false"}, null, null, null);

    if (myCursor.moveToFirst()) {
        do {
            Device d = new Device(Integer.valueOf(myCursor.getString(0)), myCursor.getString(1),Integer.valueOf(myCursor.getString(2)), Float.valueOf(myCursor.getString(3)));

            Devices.add(d);
        } while (myCursor.moveToNext());
        return Devices;
    }

    return null;

    }


public Device getDevice(String DeviceType,String RoomType,int floor) throws SQLException 
{
    Cursor mCursor =
          db.query("Rooms", new String[] {"_RoomID" }, "RoomType=? AND floor=?", new String[] {RoomType, floor+""}, null, null, null);

    if(mCursor.moveToFirst())
    {
        mCursor.moveToFirst();

        int id=Integer.valueOf(mCursor.getString(0));
        Cursor myCursor =
                db.query("Devices", new String[] {"current_state","current_level","current_CD_Channel" }, "DeviceType=? AND RoomID=?", new String[] {DeviceType, id+""}, null, null, null);

        if(myCursor.moveToFirst())
        {
            myCursor.moveToFirst();     
            Device d=new Device(DeviceType,floor,RoomType,myCursor.getString(0), Integer.valueOf(myCursor.getString(1)),Float.valueOf(myCursor.getString(2)));
            return d;
        }else 
            return null;
    }else
        return null;

}



public void updateDevice(int floor, String RoomType, String DeviceType, String current_state,int current_level,float current_CD_Channel  ) {
    SQLiteDatabase db = DBHelper.getWritableDatabase();

    Cursor mCursor =
            db.query("Rooms", new String[] {"_RoomID" }, "RoomType=? AND floor=?", new String[] {RoomType, floor+""}, null, null, null);

        mCursor.moveToFirst();

        int id=Integer.valueOf(mCursor.getString(0));

    ContentValues values = new ContentValues();
    values.put("current_state", current_state);
    values.put("current_level", current_level);
    values.put("current_CD_Channel", current_CD_Channel);
    values.put("updated", "false");


    db.update("Devices", values, "RoomID= ? AND DeviceType=?",new String[] { String.valueOf(id),DeviceType  });

    db.close();
}


public void SyncDevice(int id, String current_state,int current_level,float current_CD_Channel  ) {
    SQLiteDatabase db = DBHelper.getWritableDatabase();



    ContentValues values = new ContentValues();
    values.put("current_state", current_state);
    values.put("current_level", current_level);
    values.put("current_CD_Channel", current_CD_Channel);
    values.put("updated", "true");

    // updating row
    db.update("Devices", values, "_DeviceID= ?", new String[] { String.valueOf(id) });
    db.close();
}
</code></pre>

<p>}</p>

<p>logcat message when running the app on ice-cream sandwich emulator :</p>

<pre><code>    06-26 22:59:29.418: E/AndroidRuntime(6230): FATAL EXCEPTION: main

06-26 22:59:29.418: E/AndroidRuntime(6230): android.database.sqlite.SQLiteException: no such table: users: , while compiling: SELECT DISTINCT _id, username, password FROM users WHERE username='aya'

06-26 22:59:29.418: E/AndroidRuntime(6230):     at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at android.database.sqlite.SQLiteCompiledSql.&lt;init&gt;(SQLiteCompiledSql.java:68)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at android.database.sqlite.SQLiteProgram.&lt;init&gt;(SQLiteProgram.java:127)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at android.database.sqlite.SQLiteProgram.&lt;init&gt;(SQLiteProgram.java:94)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at android.database.sqlite.SQLiteQuery.&lt;init&gt;(SQLiteQuery.java:53)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1564)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1449)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1405)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at cse.HomeAutomation.DBAdapter.getuser(DBAdapter.java:79)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at cse.HomeAutomation.Login$1.onClick(Login.java:53)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at android.view.View.performClick(View.java:3511)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at android.view.View$PerformClick.run(View.java:14105)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at android.os.Handler.handleCallback(Handler.java:605)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at android.os.Handler.dispatchMessage(Handler.java:92)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at android.os.Looper.loop(Looper.java:137)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at android.app.ActivityThread.main(ActivityThread.java:4424)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at java.lang.reflect.Method.invokeNative(Native Method)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at java.lang.reflect.Method.invoke(Method.java:511)
06-26 22:59:29.418: E/AndroidRuntime(6230):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)

06-26 22:59:29.418: E/AndroidRuntime(6230):     at dalvik.system.NativeStart.main(Native Method)
</code></pre>

<p>I searched a lot but didn't find a solution for this problem ... 
thank you so much in advance :) </p>
