Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Database not getting copied properly in OnePlus Two

Tags:

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

like image 236
Jignesh Ansodariya Avatar asked Sep 21 '15 14:09

Jignesh Ansodariya


2 Answers

Database path may be different in different devices. You need to use Context.getDatabasePath(String) in order to get database path.

e.g.

File backupDB = context.getDatabasePath(backupDBPath); 
like image 198
Ugur Ozmen Avatar answered Oct 02 '22 07:10

Ugur Ozmen


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!

like image 39
Jignesh Ansodariya Avatar answered Oct 02 '22 07:10

Jignesh Ansodariya