Search code examples
androidsqliteassetsoneplustwo

Database not getting copied properly in OnePlus Two


I am creating an Android Application and I am using sqlite database in it. for that I have placed a sqlite file in assets folder of project and I am copying this file to phone while my first execution of application using code below.

 private void copyDataBase() throws IOException {
    new File(DB_PATH).mkdirs();
    InputStream myInput = appContext.getAssets().open(DB_NAME);
    String outFileName = DB_PATH + DB_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();
}

but I am getting this errors.

 09-21 18:03:56.841: E/SQLiteLog(7850): (1) no such table: tbl_player

but this table is exists in assets file. so I fetched database file from phone using this method.

public static void exportDB(String databaseName, Context context) {
    try {
        File sd = Environment.getExternalStorageDirectory();
        File data = Environment.getDataDirectory();

        if (sd.canWrite()) {
            String currentDBPath = "//data//" + context.getPackageName()
                    + "//databases//" + databaseName + "";
            String backupDBPath = "sensor_game.db";
            File currentDB = new File(data, currentDBPath);
            File backupDB = new File(sd, backupDBPath);

            if (currentDB.exists()) {
                FileChannel src = new FileInputStream(currentDB)
                        .getChannel();
                FileChannel dst = new FileOutputStream(backupDB)
                        .getChannel();
                dst.transferFrom(src, 0, src.size());
                src.close();
                dst.close();
            }
        }

    } catch (Exception e) {

    }
}

and I found that there is no table in fetched database file.

Note: This issue is occurs only in OnePlus Two and working fine in Nexus 4, Htc 820,Moto E,Galxy S3and Galaxy Quottro


Solution

  • After a long tries and searches I forced to assume that there should be a bug in OP2 manufacturing as it is working fine in all other devices.

    and I changed my approach to create database using query rather than copying database file from assets. like code below

    import java.io.File;
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.SQLException;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteException;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.util.Log;
    
    public class MySQLiteHelper extends SQLiteOpenHelper implements DBConstants {
    
    private static MySQLiteHelper mInstance = null;
    private SQLiteDatabase myDataBase;
    private static String DB_PATH = "";
    
    public MySQLiteHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        try {
            if (checkDataBase())
                openDataBase();
            else
                myDataBase = this.getReadableDatabase();
        } catch (Exception e) {
        }
    }
    
    public static MySQLiteHelper instance(Context context) {
    
        File outFile = context.getDatabasePath(DATABASE_NAME);
        DB_PATH = outFile.getPath();
    
        if (mInstance == null) {
            mInstance = new MySQLiteHelper(context);
        }
    
        return mInstance;
    }
    
    private void openDataBase() throws Exception {
        try {
            myDataBase = SQLiteDatabase.openDatabase(DB_PATH, null,
                    SQLiteDatabase.OPEN_READWRITE);
        } catch (SQLException e) {
            // TODO: handle exception
        }
    }
    
    private boolean checkDataBase() {
        SQLiteDatabase checkDB = null;
        try {
            checkDB = SQLiteDatabase.openDatabase(DB_PATH, null,
                    SQLiteDatabase.OPEN_READONLY);
    
        } catch (SQLiteException e) {
            /** database does't exist yet. */
        } catch (Exception e) {
        }
        if (checkDB != null) {
            checkDB.close();
        }
        return checkDB != null ? true : false;
    }
    
    @Override
    public void onCreate(SQLiteDatabase db) {
    
        Log.v("log_tag", "onCreate");
        myDataBase = db;
    
        // creating a sample table
        String CREATE_DEVICE_TABLE = "CREATE TABLE " + DEVICE + " ("
                + KEY_DEVICEID + " TEXT, " + KEY_OPERATOR + " TEXT, "
                + KEY_DEVICENAME + " TEXT, " + KEY_DEVICETOTALMEMORY
                + " INTEGER, " + KEY_SCREENWIDTH + " INTEGER, "
                + KEY_SCREENHEIGHT + " INTEGER, " + KEY_OPERATINGSYSTEM
                + " TEXT)";
    
        db.execSQL(CREATE_DEVICE_TABLE);
    
        // other tables also can be created from here.
    }
    
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + DEVICE);
    
        // Create tables again (as per requirement)
        this.onCreate(db);
    }
    
    public Cursor rawQuery(String qry) {
        return myDataBase.rawQuery(qry, null);
    }
    
    public long insert(String tableName, ContentValues cv) {
        return myDataBase.insert(tableName, null, cv);
    }
    
    public void insertWithOnConflict(String tableName, ContentValues cv,
            int flag) {
        myDataBase.insertWithOnConflict(tableName, null, cv, flag);
    
    }
    
    public long update(String tableName, ContentValues cv, String whereClose) {
        return myDataBase.update(tableName, cv, whereClose, null);
    
    }
    
    public int deleteData(String table_name, String whereClause) {
        return (int) myDataBase.delete(table_name, whereClause, null);
    }
    
    }
    

    and it worked for me

    Thanks!