I am using an external database in android app and it is working fine on all emulators and on samsung real devices. But when I am checking on the Acer smart phone, my application going crash with following exception:
android.database.sqlite.SQLiteException: no such table:
It is strange to me. I have checked under the data folder in file explorer where my databases and all tables are present.
I am not getting why it is happening.
Please guide me. Thanks in advance
Code of sql helper class is as following:
public class MyDatabaseHelper extends SQLiteOpenHelper {
// System path of application database.
private static String DB_PATH = MyApplication.getAppContext()
.getFilesDir().getParentFile().getPath()
+ "/databases/";
private static String DB_NAME = "myDB";
private SQLiteDatabase myDataBase;
private final Context myContext;
/**
* Constructor Takes and keeps a reference of the passed context in order to
* access to the application assets and resources.
*
* @param context
*/
public MyDatabaseHelper(Context context) {
super(context, DB_NAME, null, 1);
this.myContext = context;
}
/**
* Creates a empty database on the system and rewrites it with own database.
*
*/
public void createDataBase() throws IOException {
checkDataBase();
// Creates empty database default system path
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
/**
* Checks if the database already exist to avoid re-copying the file each
* time whenever the application opened.
*
* @return true if it exists, false if it doesn't
*/
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READONLY);
} catch (SQLiteException e) {
e.printStackTrace();
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null ? true : false;
}
/**
* Copies database from local assets-folder to the just created empty
* database in the system folder and from where it can be accessed and
* handled using byte stream transferring.
*
*/
private void copyDataBase() throws IOException {
// Open local db as the input stream
InputStream myInput = myContext.getAssets().open(DB_NAME + ".db");
// Path of the just created empty db
String outFileName = DB_PATH + DB_NAME;
// Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
// transfer bytes from the input file to the output file
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
// Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
}
public SQLiteDatabase openDataBase() throws SQLException {
// Opens the database
String myPath = DB_PATH + DB_NAME;
return SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READONLY);
}
@Override
public synchronized void close() {
if (myDataBase != null)
myDataBase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase arg0) {
// TODO Auto-generated method stub
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
}
}
try with this private static String DB_PATH = "/data/data/your package name/databases/";
Probably you have hardcoded the path to the database. For different devices it may be different. Use
Envirenment.getExternalStorageDirectory()
to create the path to your database.Finally I resolved my question.
I just get readable database into the database and close it just after open it again. My complete code is as follows:
I found my answer here: