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 S3
and Galaxy Quottro
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);
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!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With