Failed to create SQLite DB in my Google Nexus One device in Android?

658 Views Asked by At

I am working on an application in which I am creating my local sqlite database, and its working successfully in all the devices except the Google Nexus One with OS 2.3.3. Logs:

 CREATE TABLE android_metadata failed
Failed to setLocale() when constructing, closing the database
android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed
    at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
    at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1987)
    at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1855)
    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854)
    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847)
    at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:567)
    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
    at com.weg.ecatalogue.database.ECatalogueDatabase.open(ECatalogueDatabase.java:76)
    at com.weg.ecatalogue.HomeScreen.onCreate(HomeScreen.java:219)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
    at android.app.ActivityThread.access$1500(ActivityThread.java:123)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:3839)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
    at dalvik.system.NativeStart.main(Native Method)
  Deleting and re-creating corrupt database /data/data/com.weg.ecatalogue/databases/ECatalogue
  android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed
    at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
    at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1987)
    at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1855)
    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854)
    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847)
    at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:567)
    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
    at com.weg.ecatalogue.database.ECatalogueDatabase.open(ECatalogueDatabase.java:76)
    at com.weg.ecatalogue.HomeScreen.onCreate(HomeScreen.java:219)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
    at android.app.ActivityThread.access$1500(ActivityThread.java:123)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:3839)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
    at dalvik.system.NativeStart.main(Native Method)

Please suggest me, how can I solve this problem..!!:(

public class ECatalogueDatabase {

    private static final String DB_PATH = "/data/data/com.weg.ecatalogue/databases/";
    public static final String DATABASE_NAME = "ECatalogue";
    public static final String DATABASE_TABLE = "T_Electrical";
    public static final int DATABASE_VERSION = 1;

    public static final String KEY_ROWID="id";
    public static final String KEY_PRODUCT_LINE="productline";

    public static final String KEY_VOLTAGE="voltage";
    public static final String KEY_OUTPUTHP="outputhp";

    public static final String KEY_FRAME="frame";
    public static final String KEY_RPM="rpm";

    private Context context=null;
    private DatabaseHelper DBHelper;
    private SQLiteDatabase db;

    /**
     * Database creation sql statement
     */
    private static final String CREAT_DATABASE="Create Table if not exists "+ DATABASE_TABLE+"("+ KEY_ROWID +" INTEGER PRIMARY KEY NOT NULL,"
    +KEY_PRODUCT_LINE +" nvarchar ,"+ KEY_OUTPUTHP+" numeric ,"+ KEY_RPM +" nvarchar ,"+KEY_VOLTAGE +" nvarchar ," +KEY_FRAME +" nvarchar"+")";

    /**
     * Constructor - takes the context to allow the database to be
     * opened/created
     *
     * @param ctx the Context within which to work
     */
    public ECatalogueDatabase(Context ctx) {
        this.context = ctx;
        DBHelper = new DatabaseHelper(context);
    }
    //Helper class
    private static class DatabaseHelper extends SQLiteOpenHelper
    {
        public DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREAT_DATABASE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS titles");
            onCreate(db);
        }

    }

    public ECatalogueDatabase open() //throws SQLException
    {
        try
        {
            db=DBHelper.getWritableDatabase();

        }catch(Exception exception)
        {
            exception.printStackTrace();
        }
        return null;
    }


    public void close()
    {
        DBHelper.close();
    }



    /**
     * Creates a empty database on the system and rewrites it with your own database.
     * */
    public void createDataBase() throws IOException{

        @SuppressWarnings("unused")
        boolean dbExist = checkDataBase();

        /**
        * CHANGES DONE BY SHAILESH SHARMA TO SOLVE THE PROBLEM OF 2.2 HTC DESIRE IN CLIENT'S WIFE DEVICE :(
        */
        SQLiteDatabase db_Read = null;
        if(dbExist){
        //DO NOTHING IN THIS CASE
        }else{

        db_Read = DBHelper.getReadableDatabase();
        db_Read.close();
        }
        //=================================

        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(){
        try{
            String myPath = DB_PATH + DATABASE_NAME;
            db = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

        }catch(SQLiteException e){
            System.out.println(e+"sos sos sos sos");
        }

        if(db != null){

            db.close();

        }

        return db != 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{


        InputStream myInput = context.getAssets().open(DATABASE_NAME);

        // Path to the just created empty db
        String outFileName = DB_PATH + DATABASE_NAME;


        OutputStream myOutput = new FileOutputStream(outFileName);


        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer))>0){
            myOutput.write(buffer, 0, length);
        }
        myOutput.flush();
        myOutput.close();
        myInput.close();

    }

    public int getDatabaseCount(){
        int count = 0;
        Cursor cursor = db.rawQuery("Select * from " + DATABASE_TABLE, null);
        if(cursor!=null){
            count = cursor.getCount();
        }
        cursor.deactivate();
        cursor.close();
        return count;
    }
1

There are 1 best solutions below

9
On

If this particular database file works everywhere except in old Android versions, then it is likely that you are using some SQLite feature that is not available in older SQLite version.

For example, WAL is supported beginning with SQLite 3.7, but Froyo has SQLite 3.6.22.